繁体   English   中英

正则表达式捕获组流入第二个匹配集

[英]Regex capture group flows into second match set

我试图在同一个正则表达式中匹配多个输入来捕获后面的数字。
如果输入与第一组不匹配,那么我就会遇到问题,因为尽管它们与组不匹配,但仍然会捕获所有先前的捕获组。 我相信我需要使用一个lookaround断言,但我不熟悉那些。

样本输入:

wordA 123456
wordA: 123456
wordA : 123456
wordA R123465
wordA: R123456
wordA : R123456
wordB R123465

WordA有两个可选:R 到目前为止我有这个: /(?:wordA :?R?(\\d+)|wordB R(\\d+))/i
使用最后一个样本输入提供以下结果:

array
  0 => string 'wordB R123456' (length=13)
  1 => string '' (length=0)
  2 => string '123456' (length=6)

想要的结果是:

array
  0 => string 'wordB R123465' (length=13)
  1 => string '123456' (length=6)

任何想法如何解决?

问题是你的变化

/(?:wordA :?R?(\d+)|wordB R(\d+))/i
              ^^^^^        ^^^^^
             Group 1       Group 2

因此,如果你的正则表达式匹配第二个选项,结果将在第2组( array[2] ),第一组将为空。

把它改成这个

(?:wordA :?R?|wordB R)(\d+)

在Regexr上看到它

那么你的号码将永远在第一组(因为只有一个)

您正在定义两个捕获组,因此您将获得两个捕获组。 正则表达式实现并不关心它们中是否只有一个可以匹配。 你可以重写你的表达式

/(?:wordA :?R?|wordB R)(\d+)/i

避免定义两个捕获组。 请注意:?R? 不足以使您的测试用例与_:_:_匹配。 要获得这些,你可以使用

/(?:wordA ?:? R?|wordB R)(\d+)/i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM