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

问题描述:

我想在同一个正则表达式中匹配多个输入以捕获下面的数字。
如果输入不匹配第一组,那么我有问题,因为所有先前的捕获组仍然捕获,尽管它不匹配它们组。我相信我需要使用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+) 

看到它here on Regexr

然后你的电话号码将永远是第一组中(因为只有一个)

+0

谢谢。我知道这是因为有两组,但我想如果第一部分不匹配,那么其余部分将被忽略。这是一个错误的假设。 – Kim 2012-04-16 13:55:44

您定义两个捕获组,因此你会得到两个结果。正则表达式的实现并不在乎它们每次只能匹配其中的一个。您可以将您的表情重写为

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

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

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