Что означает это регулярное выражение: \\ d {3} - \\ d {4}. * - PullRequest
0 голосов
/ 21 декабря 2011

Обратите внимание на пробелы в regx! В любом случае, спасибо всем, кто пытается внести свой вклад. Я думаю, с пробелами это действительно сложно.

Я видел, что текущий код имеет следующее:

Perl5Compiler compiler = new Perl5Compiler();
Perl5Matcher matcher = new Perl5Matcher();
Pattern pattern = compiler.compile("\\ d{ 3 } -\\d{4}.* "); // pattern for string starting with " 00 0 - 00 0 0 "   

if (matcher.matches(Num, pattern)) {  
    return true;  
}  

Однако я не чувствую, что "\\ d{ 3 } -\\d{4}.* " будет соответствовать " 00 0 - 00 0 0 ". Кто-нибудь знает, что в действительности означает это регулярное выражение? Или с другой точки зрения, какое правильное регулярное выражение для "00 0 - 00 0 0"?

Ответы [ 6 ]

4 голосов
/ 21 декабря 2011

Строковый литерал

"\\d{3}-\\d{4}.*"

создает строку

\d{3}-\d{4}.*

При использовании в качестве шаблона регулярного выражения Perl5Matcher он сопоставляет строки, которые

  1. Начинается с3 цифры *
  2. , за которыми следует тире
  3. , за которыми следуют 4 цифры
  4. , за которыми следуют 0 или более символов, которые не являются символами новой строки **
  5. Затем следуетконец строки.

Например,

  • 123-1234: совпадение
  • 123-1234XYZ: совпадение
  • 123-1A34: нет совпадений
  • 1234-123: нет совпадений
  • X123-1234: нет совпадений

* - В Perl a цифра - любой символ с общей категорией Unicode «Десятичное число».В Unicode 6.0 есть 420 таких символов, включая от 0 до 9.Я не знаю точно, какие символы \d соответствуют при использовании библиотеки Perl5Matcher.Используйте [0-9] вместо \d только для совпадения от 0 до 9.

** - По умолчанию . соответствует любому символу, кроме новой строки.Perl5Compiler может сказать, что . должен соответствовать любому символу, включая перевод строки.

2 голосов
/ 21 декабря 2011

Эти люди правы, что оно будет соответствовать ###-####

Но они забывают объяснить .*, что означает, по сути, "все остальное", . представляет любой символ, кроме новой строки.

Это не сильно влияет на успех регулярного выражения, но не позволяет регулярному выражению охватывать несколько новых строк при совпадении.Обычно это идеально, в зависимости от того, ожидаете ли вы новых строк в вашем вводе и что они означают явно.

РЕДАКТИРОВАТЬ: Прежде всего, отредактированное регулярное выражение не будет компилироваться в Java с пробелами между {}пробелы внутри не имеют смысла, он только ищет количественные числа.

Итак, если вы удалите эти пробелы между {}, это будет соответствовать

" ddd -#### "

Где «d» в данном случае - буквально буква «d», а «#» - любая цифра.Опять же, за этим может следовать что угодно из-за .*.Но теперь, поскольку после .* есть дополнительный пробел, соответствующая строка также должна заканчиваться хотя бы одним пробелом .... Хотя это довольно бесполезное выражение, вы уверены, что хотите интерпретировать этот первый d буквально??Возможно, вам следует снова проверить свой синтаксис .....

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

"\\ d{3} -\\d{4}.* " синтаксически эквивалентно " d{3} -\\d{4}.* "

1 голос
/ 27 февраля 2013

Регулярное выражение \ d{3} -\d{4}.* соответствует строкам вида ddd -XXXXY, где каждая из X может быть любой цифрой, а Y может быть любой строкой.

Это прощечтобы увидеть, что делает это регулярное выражение, когда у вас есть визуальный помощник, чтобы показать вам, что происходит: http://www.debuggex.com/?re=%5C+d%7B3%7D+-%5Cd%7B4%7D.%2A+&str=+ddd+-9662%C2%A3%C2%AA%C2%A3%3B%29+

1 голос
/ 21 декабря 2011

Это использование Jakarta Oro (кстати, оно ушло на пенсию в течение двух лет).

Единственное, что я могу видеть, это то, что пробелы были полностью перепутаны, потому что если вы берете регулярное выражение ^\d{3}-\d{4}.*$, оно фактически соответствует тому, что говорит (пробел) комментарий, то есть любая строка, начинающаяся с три цифры, затем дефис, затем 4 цифры.

И обратите внимание, что .matches() является неправильным (как и методы .matches() Java в этом отношении), поскольку он пытается сопоставить весь ввод, который не является определением соответствия регулярному выражению (и именно поэтому я закрепил регулярное выражение).

1 голос
/ 21 декабря 2011

Похоже (с удаленными пробелами) он должен соответствовать номеру телефона (без кода страны и города).

\d{3}-\d{4} означает <three digits> - <four digits> или XXX-XXXX (где каждый X является цифрой).

1 голос
/ 21 декабря 2011

Это регулярное выражение (если пробелы удалены) будет соответствовать любому выражению вида

###-####

Где # представляет собой цифру, а - означает буквально -.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...