我想在字符串的可选部分中捕获组。
例如:
在字符串“ firstName:Bill-lastName:Gates”中,我要捕获2个组:
我使用此正则表达式:
firstName:(.*)-lastName:(.*)
但是当lastName-part是可选的时,我仍然想捕获第一组(firstName)。
我使用此正则表达式使lastName-part为可选(在非捕获组中):
firstName:(.*)(?:-lastName:(.*))?
使用此更新的正则表达式,结果组为:
当lastName部分不存在时,例如“ firstName:Bill”,捕获的组为:
这是正确的,
当存在firstName和lastName部分:“ firstName:Bill-lastName:Gates”时,组不正确:
我认为这与第一个捕获组的贪婪有关,但是当lastName-part是可选的时,如何调整此正则表达式以使正则表达式起作用?
您是对的,这与贪婪有关。查找第一个匹配组的定界符。因此,如果您的名字“从不”包含破折号,则只将破折号与第一个匹配组匹配。
firstName:([^-]*)(?:-lastName:(.*))?
firstName:([^-]*)(?:-lastName:(.*))?
如果找不到这样的分隔符,则需要采取其他方法。即使您尝试将第一个模式设置为“惰性”,Regex引擎始终还是会选择更大的匹配项而不是匹配其他可选匹配项。
这是因为惰性匹配组将匹配满足表达式的第一个字符串(!重要措辞!)。
可能有一个带有外观的选项,但是您也可以使用-语句而不提供可选的匹配项:
firstName:(.*)-lastName:(.*)|firstName:(.*)
这样,正则表达式引擎将匹配或,但更喜欢具有2个匹配项的模式,因为它首先列出。仅在不适用的情况下,它将尝试一次匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句