2016-09-14 4 views
1

я не могу следовать, почему эти два выражения различны:регулярного выражения без захвата и захватывая группы и необъяснимое потребление

^(\d+)(?:\.(\d+))?(?:\.(\d+))?$ 
applied to 1.0.3 
group 1 =>1 
group 2 =>0 
group 3 =>3 

, который, как ожидается. но если я пытаюсь обобщить для любого ряда \d\. то больше не работает:

^(\d+)(?:\.(\d+))+$ 
applied to 1.0.3 
group 1 =>1 
group 2 =>3 

И достаточно странно для меня все, кроме первой и последней записи исчезает:

^(\d+)(?:\.(\d+))+$ 
applied to 1.2.3.4.5.6.7.8.9 
group 1 =>1 
group 2 =>9 

Не совсем что я ожидал

+1

Только последний подходящий текст доступен во второй группе захвата. Группы не являются динамическими, независимо от того, какие группы вы определяете, и многие из них получат согласованный результат. – anubhava

+0

Повторяющиеся группы захвата ведут себя так. –

ответ

0

Попробуйте следующее регулярное выражение, который захватывает все номера, по крайней мере, одну цифру и поместите их в разделенных групп:

(?<=^|\.)(\d+)(?=\.|$) 

Это работает просто. Опишем части регулярное выражение:

  • (?<=^|\.) является положительным просмотром назад проверок, если число \d+ следует точка . характера (примечание должно быть экранированы \., в противном случае это означает, что любой символ) или начало строки ^.
  • \d+ это число, чтобы быть захвачены
  • (?=\.|$) является положительным опережения проверки, если число \d+ сопровождается точкой . или в конце линии $.

Попробуйте в Regex101, где представлено более подробное объяснение.

+0

Спасибо, как-то я не знал, что группы захвата, где не динамические, как сказал анубхава. Ваше решение показывает другой способ получения этих значений. – estani

+0

В конце концов не нужно использовать '+?', Просто '(? <=^| \.) \ D + (? = \. | $)' Достаточно. – anubhava

+0

Вы правы, спасибо :) –