2013-12-17 4 views
2

Хотелось бы спросить, есть ли разница между этими двумя регулярными выражениями?Эти синтаксисы \ d \ d \ d и \ d {3} работают одинаково во всех средах?

\d\d\d против \d{3}

Я испытал это в моей локальной машине с помощью Java и ОС Windows и оба работают совершенно нормально, и иметь тот же результат. Однако при работе в среде linux \d\d\d работает нормально, а \d{3} - нет. Является ли среда фактором здесь? Или что еще может быть фактором, который делает эти выражения одинаковыми?

вот фрагмент кода:

Pattern pattern = Pattern.compile(".*aaa\\.bbb\\d{3}.ccc\\d{3}."); 
Matcher matcher = pattern.matcher("aaa.bbb033.ccc342.ffff"); 
matcher.find(); 

Использование \d\d\d, Matcher.find() = True

использованием \d{3}, Matcher.find() = ложь

+1

Это не регулярное выражение. Это было что-то еще. –

+1

На каком языке? C# .NET? –

+0

Это эквивалентные регулярные выражения. Это должно быть что-то с тем, как вы его выполняете. Пожалуйста, покажите свой тестовый код (точно). Btw @shiplu, это явно java, поэтому я добавил тег java. – Bohemian

ответ

1

Нет, есть различные диалекты regex. [1]grep даже знает более одного.

grep 'abc|def'  # Matches abc|def 
grep 'abc\|def' # Matches abc or def 
grep -P 'abc|def'  # Matches abc or def 
grep -P 'abc\|def' # Matches abc|def 

Хороший старый grep (без -P или -E) просто не признает a{m}. Или \d.

$ cat foo 
123 
1{3} 
\d{3} 
\d\d\d 

$ grep '\d{3}' foo 
\d{3} 

$ grep '\\d\\d\\d' foo 
\d\d\d 

$ grep '\d\d\d' foo 
ddd 

Хотя это происходит в режиме «Perl» (и в режиме «Extended» в некоторых версиях)

$ grep - P '\d{3}' foo 
123 

$ grep -P '\d\d\d' foo 
123 

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


  1. На самом деле, регулярное выражение некоторых языков не являются технически регулярные выражения со стороны original definition больше, поскольку они могут соответствовать более чем regular languages.
+0

Привет @ikegami спасибо за ответ. Если я правильно понимаю, оба выражения (\\ d \\ d \\ d и \\ d {3}) не могут быть распознаны в Linux, если только в режиме perl? Что бы вы предложили сделать, чтобы эти оба выражения были распознаны в обеих средах (linux и windows) – Yuna

+0

Unix grep ** понимает ** '\ d {3}' в расширенном режиме. Запустите 'echo -e '123 \ nab3' | grep -E '\ d {3}' 'на консоли, чтобы увидеть его в действии. –

+0

Это не имеет никакого отношения к ОС. Различные инструменты ('grep' vs' java') имеют разные языки соответствия. – ikegami

Смежные вопросы