Почему мое регулярное выражение, содержащее \ d {1,} вместе с отрицательным прогнозом, по-прежнему совпадает, а где нет? - PullRequest
1 голос
/ 16 августа 2011

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

для сопоставления:

558,228
558,228,
558,228,589
558,228,A,B,C

НЕ для сопоставления:

558,228,<Text>

Regex ^558,228(?!,<).* выполняетработа, а ^\d{1,},\d{1,}(?!,<).* нет.Это то же самое регулярное выражение с метасимволом \ d вместо значений.Есть идеи почему?

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

Причиной является деталь .* в конце.Это соответствует всему, что не было найдено ранее.В сочетании с \d{1,}, который позволяет сопоставлять менее 3 цифр, он будет выглядеть следующим образом: ^\d{1,},\d{1,}(?!,<) будет соответствовать 558,22, а .* будет соответствовать оставшейся части 8,<Text>.

2 голосов
/ 16 августа 2011

Проблема заключается в детали \d{1,} в сочетании с .* в конце.

В вашем случае

558,228,<Text>

^\d{1,},\d{1,}(?!,<) соответствует ">558,22", а .* соответствует остальным "8,<Text>"

Вы можете решить эту проблему, используя собственнический квантификатор ++

^\d+,\d++(?!,<)(.*)

См. здесь, на Regexr

\d++ - редко используемый притяжательный квантификатор, который здесь полезен. ++ означает совпадение, по крайней мере, один раз столько, сколько вы можете и не возвращать . Это означает, что он не вернет цифры после того, как найдет их.

Учебник по Java Quantifier

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