2017-02-21 14 views
0

У меня есть сыпучая строка, которая имеет некоторый случайный текст, как показано ниже:Как написать шаблон регулярного выражения для строки, чтобы идентифицировать числа, предшествующие пробелу или hypen?

  • "Some random text 080 2668215901"
  • "Some ramdom text 040-1234567890"
  • "Some random text 0216789101112"

мне нужно, чтобы захватить 3-значное число, и следующий 10 цифр:

  • с пространством состояния
  • с hypen условием
  • без какого-либо пространства/hypen

Я использую Java.

Это то, что я пытался получить номера из сыпучего текста:

"\\w+([0-9]+)\\w+([0-9]+)" 

я могу сделать проверку длины строки, чтобы увидеть, если есть какие-либо 3 цифры номера, который предшествует Hypen или пробел, за которым затем следует десятизначный номер. Но я действительно хотел бы изучить, может ли регулярное выражение дать мне лучшее решение.

Кроме того, если в строке есть больше случаев, мне нужно будет их захватить. Мне также понадобится захватить любую 10-разрядную строку, чтобы не нуждался в предшествовавший окну и пробелу

+0

Что означает «с пространственным состоянием»? –

+0

Вы хотите захватить первые 3 цифры и следующие 10 цифр или вы хотите проверить шаблон? – Loc

+0

Условие, которое имеет пробел (""). В примере это его первый сценарий. – Javaenthu

ответ

0

Вот более длинная демонстрация. Из ваших ответов выше вы также ищете спички с завершающими символами после матча.

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class Class { 
    private static final Pattern p = Pattern.compile("" + 
    "((?<threeDigits>\\d{3})[- ]?)?" + 
    "(?<tenDigits>\\d{10})"); 

    public static void main(String... args) { 
    final String input = 
     "Here is some text to match: Some random text 080 2668215901. " + 
     "We're now matching stray sets of ten digit as well: 1234567890. " + 
     "Notice how you get the first ten and the second ten, with the preceding three:1234123412-040-1234567890" + 
     "A stranger case:111222333444555666777888. Where should matches here begin and end?"; 
    printAllMatches(p.matcher(input)); 
    } 

    private static void printAllMatches(final Matcher m) { 
    while (m.find()) { 
     System.out.println("three digits: " + m.group("threeDigits")); 
     System.out.println("ten digits: " + m.group("tenDigits")); 
    } 
    } 

} 

перешел на поисковый битплан.

+0

Спасибо, Андреас, я могу попробовать его на моем образце. Но делает ли \\ D? включают только пробелы и гипноз? – Javaenthu

+0

Привет, Андреас, не могли бы вы предоставить более длинную демонстрацию? – Javaenthu

+0

Спасибо Андреасу, это действительно помогает. Как мы игнорируем вкладки? Также, сделайте в первом сцене, если я хочу включить 10-значное число вместе с другим, как меняет мое регулярное выражение? – Javaenthu

2

Обычно (\d{3})[ -]?(\d{10})
с граничными условиями возможно (?<!\d)(\d{3})[ -]?(\d{10})(?!\d)

+0

Я пробовал это со строкой: abce 3343444888 333 3344556677 bcbcb. результаты :( – Javaenthu

+0

'** Grp 0 - (позиция 17, len 14) 333 3344556677 ** Grp 1 - (позиция 17, len 3) 333 ** Grp 2 - (поз. 21, len 10) 3344556677' – sln

+0

@Paul ' \ s' также соответствует вкладке, строке и другим символам в классе символов пробелов. –

1

Предполагая, что вы будете запускать это регулярное выражение на отдельных линиях, и игнорируя некоторые из ... более выразительных реализаций регулярных выражений, это, пожалуй, самый простой способ:

/([0-9]{3})[ -]?([0-9]{10})/ 

Если ваш текст может закончиться в цифрах, вам нужно, чтобы закрепить результат в конце линии, как это:

/([0-9]{3})[ -]?([0-9]{10})$/ 

Если вы гарантированы буквенные символы двойных кавычек вокруг входов, можно использовать вместо:

/([0-9]{3})[ -]?([0-9]{10})"$/ 

И если вам нужно, чтобы соответствовать всей линии для некоторого тестирования входной ошибки, вы можете использовать:

/^"(.+)([0-9]{3})[ -]?([0-9]{10})"$/