Как сопоставить группу обязательно, если это происходит? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть строка

Name: abc
        No:  1234
new: yes
DOB:    06-07-1992
     sal:  40000

В этой строке я хочу сопоставить имя, dob, no и sal.

Новое должно совпадать, если получится иначене нужно совпадать.Я пробовал регулярное выражение,
(?:name:\s*(\S+)).*?(?:no:\s*(\d+)).*?(?:new:\s*(yes))?.*?(?:dob:\s*(\d{2}-\d{2}-\d{4})).*(?:sal:\s*(\d+))

Regex .Я сделал группу (?:new:\s*(yes))? необязательной.Но это не соответствует, если это происходит.Как сопоставить эту группу обязательно, если это происходит?Любая помощь?

1 Ответ

0 голосов
/ 26 сентября 2018

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

name:\s*(\S+).*?no:\s*(\d+)(?:.*?new:\s*(yes))?.*?dob:\s*(\d{2}-\d{2}-\d{4}).*sal:\s*(\d+)
                           ^^^^^^^^^^^^^^^^^^^^

См. Демонстрационный пример regex

когда вы сделали его необязательным, он просто соответствовал пустой строке и, таким образом, группа была пустой.В (?:.*?new:\s*(yes))?, .*? будет соответствовать любым символам как можно меньше (каждый раз, когда этот шаблон пропускается и new:\s*(yes) пробуется, и только когда он не совпадает, .*? расширяется).И поскольку new:\s*(yes) является обязательным, оно будет пробоваться хотя бы один раз, и если соответствующая подстрока присутствует, она будет захвачена.

...