[英]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.