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

时间:2012-04-16 13:41:20

标签: php regex preg-match

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

任何想法如何解决?

2 个答案:

答案 0 :(得分:3)

问题在于你的改变

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

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

将其更改为此

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

here on Regexr

然后您的号码将始终位于第一组(因为只有一个)

答案 1 :(得分:1)

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

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

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

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