2017-01-11 2 views
0

Я изучаю регулярное выражение. Когда я соответствовать этому:Regex - Почему знак вопроса ведет себя так?

\d[^\w]\d 

на этом

30-01-2003 15:20 

я получаю 3 матча: 0-0, 1-2, 3 5, и 5: 2. Когда я пытаюсь добавить знак вопроса в конце регулярного выражения (\d[^\w]\d?), мои совпадения не меняются. Когда я перехожу к вопросительному знаку после квадратной скобки (\d[^\w]?\d), совпадения теперь 30, 01, 20, 03, 15 и 20. Когда я перемещаю вопросительный знак до квадратной скобки (\d?[^\w]\d), мой совпадения те же, что и в первом случае.

Почему это? Я знаю, что оператор ? отмечает предыдущий символ как необязательный, поэтому я ожидал поведения во втором случае, но не в первом или третьем.

+0

Если вы не знаете, https://regex101.com анализирует и объясняет регулярные выражения довольно хорошо. –

+0

Спасибо. Я проверю это – shalvah

ответ

2

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

Подумайте об ? в конце как определение двух регулярных выражений: \d[^\w]\d и \d[^\w]. В вашем тестовом примере у вас никогда не было совпадения, когда первое регулярное выражение не совпадает, а второе - без перекрытий, опять же, оно жадно. Вот почему ваши матчи никогда не меняются.Однако, если вы изменили свой тестовый пример этому:

30-01-2003 15:20/ 

Вы получите дополнительный матч 0/ в зависимости от того, включаете ли вы или нет знак вопроса в конце регулярного выражения.

+0

Является ли '*' также жадным? – shalvah

+0

Да, это так. Чтобы сделать либо притяжательным, либо не жадным, суффикс их с '+', например. '? +' или '* +'. – nickb

0

U просто нужно это

-Два

Solutions-

1. REGEXP:

\d+ 

1. Объяснение:

\d =>numbers 
+ => 1 or more 

2. REGEXP

[0-9]+ 

2. Объяснение

[0-9] <= Numbers 
+ <= 1 or more 

это будет соответствовать все номера (раствор 1 или 2)

Оригинальный текст:

30-01-2003 15:20 

Результат:

30 
01 
2003 
15 
20 

Наслаждайтесь.

См:https://regex101.com/r/xXaLgN/6

+0

Пока вы (вроде) объяснили \ d +, это был не тот вопрос. – bartonjs

+0

Я объясняю, как записывать числа, если вы квалифицируете отрицательный результат, когда я пытаюсь помочь знаниям, де-мотивируйте это. –

1

Ваш первый и третий случай производит те же результаты, что и оригинал, только из-за конкретной строки, которую вы ищете, - это НЕ эквивалентный поиск в целом. В частности, каждое событие \d[^\w] в вашей строке сопровождается цифрой, поэтому добавление дополнительной цифры не меняет никаких совпадений. Аналогично, каждому возникновению [^\w]\d предшествует цифра. Если в вашей строке было два пробела вместе или в виде двойной метки пунктуации, результаты будут отличаться для каждого случая.

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