正则表达式捕获组流入第二个匹配集
问题描述:
我想在同一个正则表达式中匹配多个输入以捕获下面的数字。
如果输入不匹配第一组,那么我有问题,因为所有先前的捕获组仍然捕获,尽管它不匹配它们组。我相信我需要使用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+)
然后你的电话号码将永远是第一组中(因为只有一个)
答
您定义两个捕获组,因此你会得到两个结果。正则表达式的实现并不在乎它们每次只能匹配其中的一个。您可以将您的表情重写为
/(?:wordA :?R?|wordB R)(\d+)/i
避免定义两个捕获组。请注意,:?R?
不足以将您的测试案例与_:_
或:_
相匹配。 为了得到这些,你可以使用
/(?:wordA ?:? R?|wordB R)(\d+)/i
谢谢。我知道这是因为有两组,但我想如果第一部分不匹配,那么其余部分将被忽略。这是一个错误的假设。 – Kim 2012-04-16 13:55:44