正则表达式可选部分中的捕获组

领域

我想在字符串的可选部分中捕获组。

例如:

在字符串“ firstName:Bill-lastName:Gates”中,我要捕获2个组:

  1. 账单
  2. 盖茨

我使用此正则表达式:

firstName:(.*)-lastName:(.*)

但是当lastName-part是可选的时,我仍然想捕获第一组(firstName)。

我使用此正则表达式使lastName-part为可选(在非捕获组中):

firstName:(.*)(?:-lastName:(.*))?

使用此更新的正则表达式,结果组为:

  • 当lastName部分不存在时,例如“ firstName:Bill”,捕获的组为:

    1. 账单
    2. /空字符串/

这是正确的

  • 当存在firstName和lastName部分:“ firstName:Bill-lastName:Gates”时组不正确

    1. Bill-lastName:Gates
    2. /空的/

我认为这与第一个捕获组的贪婪有关,但是当lastName-part是可选的时,如何调整此正则表达式以使正则表达式起作用?

狗鼻

您是对的,这与贪婪有关。查找第一个匹配组的定界符。因此,如果您的名字“从不”包含破折号,则只将破折号与第一个匹配组匹配。

firstName:([^-]*)(?:-lastName:(.*))?

firstName:([^-]*)(?:-lastName:(.*))?

正则表达式可视化

Debuggex演示

如果找不到这样的分隔符,则需要采取其他方法。即使您尝试将第一个模式设置为“惰性”,Regex引擎始终还是会选择更大的匹配项而不是匹配其他可选匹配项。

这是因为惰性匹配组将匹配满足表达式的第一个字符串(!重要措辞!)。

可能有一个带有外观的选项,但是您也可以使用-语句而不提供可选的匹配项:

firstName:(.*)-lastName:(.*)|firstName:(.*)

这样,正则表达式引擎将匹配或,但更喜欢具有2个匹配项的模式,因为它首先列出。仅在不适用的情况下,它将尝试一次匹配。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何捕获正则表达式中的可选组?

来自分类Dev

正则表达式可选捕获组?

来自分类Dev

正则表达式可选组捕获JAVA

来自分类Dev

python正则表达式多个可选捕获组

来自分类Dev

Python正则表达式可选捕获组或lastindex

来自分类Dev

捕获可选组正则表达式 Php

来自分类Dev

带有可选捕获组的正则表达式

来自分类Dev

重复正则表达式捕获组的捕获部分

来自分类Dev

正则表达式:捕获组中的捕获组

来自分类Dev

捕获组中的正则表达式捕获组

来自分类Dev

为什么我的正则表达式中的可选捕获组不起作用?

来自分类Dev

使正则表达式捕获组在龙卷风应用程序的URL中是可选的

来自分类Dev

正则表达式中的可选组

来自分类Dev

Python中的可选正则表达式组失败

来自分类Dev

正则表达式中的可选组

来自分类Dev

自由文本中的可选正则表达式组

来自分类Dev

正则表达式:捕获组?

来自分类Dev

正则表达式,捕获组

来自分类Dev

正则表达式捕获组

来自分类Dev

正则表达式中捕获组的奇怪行为

来自分类Dev

正则表达式在Visual Studio中捕获组

来自分类Dev

Javascript正则表达式中的非捕获组

来自分类Dev

Scala正则表达式中的多个捕获组

来自分类Dev

R正则表达式中的非捕获组

来自分类Dev

Vim中的正则表达式以匹配组捕获

来自分类Dev

gsub中的Ruby正则表达式捕获组

来自分类Dev

正则表达式中的非捕获组

来自分类Dev

捕获MS Word正则表达式中的组

来自分类Dev

正则表达式:捕获组中的替代字符