我正在尝试匹配同一个正则表达式中的多个输入以捕获后面的数字
如果输入与第一组不匹配,那么我就会遇到问题,因为尽管它们与组不匹配,但仍然会捕获所有先前的捕获组。我相信我需要使用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)
任何想法如何解决?
答案 0 :(得分:3)
问题在于你的改变
/(?:wordA :?R?(\d+)|wordB R(\d+))/i
^^^^^ ^^^^^
Group 1 Group 2
因此,如果你的正则表达式匹配第二个选项,结果将在第2组(array[2]
)中,第一组将为空。
将其更改为此
(?:wordA :?R?|wordB R)(\d+)
然后您的号码将始终位于第一组(因为只有一个)
答案 1 :(得分:1)
您正在定义两个捕获组,因此您将获得两个捕获组。正则表达式实现并不关心它们中是否只有一个可以匹配。您可以将表达式重写为
/(?:wordA :?R?|wordB R)(\d+)/i
避免定义两个捕获组。请注意,:?R?
不足以使您的测试用例与_:_
或:_
匹配。
要获得这些,您可以使用
/(?:wordA ?:? R?|wordB R)(\d+)/i