2016-10-03 4 views
1

У меня есть две возможные схемы:Как выбрать группу?

1.2 hello 
1.2.3 hello 

Я хотел бы, чтобы соответствовать 1, 2 и 3, если последний существует.

Optional items, кажется, путь, но мои pattern(\d)\.(\d)?(\.(\d)).hello матчи только 1.2.3 hello (почти отлично: я получаю четыре группы, но первый, второй и четвертый содержат то, что я хочу) - первый тест жала не соответствует вообще ,

Что будет с правильным шаблоном?

ответ

1

Ваш шаблон содержит (\d)\.(\d)?(\.(\d)) части, которая соответствует цифрам, то ., то дополнительный разряд (это может быть 1 или 0), а затем . + цифра. Таким образом, он может соответствовать 1..2 hello, но не 1.2 hello.

Вы можете сделать третью группу нон-захвата и сделать его по желанию:

(\d)\.(\d)(?:\.(\d))?\s*hello 
      ^^^  ^^ 

Смотрите regex demo

Если движок регулярных выражений не позволяет без захвата группы, используйте захватывая один, только вы должны будете получить значение из группы 4:

(\d)\.(\d)(\.(\d))?\s*hello 

См this regex.

Обратите внимание, что я заменил . до hello с помощью \s*, чтобы соответствовать нулю или более пробелам.

Обратите также внимание, что если вам нужно сопоставить эти цифры в начале строки, вы можете рассмотреть предустановленный шаблон с помощью ^ (и в зависимости от вашего двигателя/инструмента регулярного выражения, модификатора m).