2013-08-06 3 views
0

Я хотел бы знать, почему ниже регулярное выражение принимает 1.Не понимаю, результат регулярных выражений

"((^G0{0,2}$)|(^T|^R0{0,2}$)){0,5}" 

Я хотел бы мое регулярное выражение, чтобы принять последовательности G00, G01, T00, R00 любое количество раз. На данный момент я только пытаюсь использовать G00, T00, R00 любое количество раз, но мое регулярное выражение также принимает 1 в качестве входных данных. Регулярное выражение также должно принимать G, G0, T, T0, R, R0, но цель состоит в том, чтобы иметь последовательность из 3 символов.

+2

Вы писали регулярное выражение, но вы его не понимаете? Как это работает? –

+7

@ MitchWheat Разве вы не знали? Некоторые регулярные выражения записываются только; -P – DarkDust

+0

что-то не так с '^ (G00 | G01 | T00 | R00) * $'? иногда проще всего. – sgroves

ответ

2

Регулярное выражение соответствует нулевому повторению чередования с длиной совпадения 0. (Если вы повторяете его 0 раз, якорь ^ не срабатывает, поэтому он может совпадать где угодно.) Вы должны извлечь якоря вне повторения. Что-то вроде ...

^(?:[GTR]\d{0,2})+$ 
-     start 
---   -- any number of repetitions (1+) of 
    -----   any of "G", "T", or "R" 
     -------  0-2 digits 
        - end 

Если ваша главная последовательность повторяется, захват группа не имеет никакого смысла, поэтому я раздел их.

+0

Спасибо, что работает с якорями за пределами повторения. – jerome

1

Прямо сейчас ваше регулярное выражение соответствует пустой строке и ничего не найдет.

(...){0, 5} 

может соответствовать ... 0 раз, таким образом, найти матчи на каждой строке.


Ваше конкретное требование (чтобы соответствовать только те 4 входа), вероятно, хотите, регулярное выражение, как это

^(?:G01)|[GRT]00$ 

http://rubular.com/r/BrlxDfGkdf

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

(?:G01)|[GRT]00 

http://rubular.com/r/3ODzf08eT5

0

Я думаю, потому что вы разрешаете 0-5 повторений этого, все может соответствовать ему 0 раз. Почему бы не заставить его соответствовать хотя бы один раз?

"((^G0{0,2}$)|(^T|^R0{0,2}$))+" 
Смежные вопросы