1

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

任何想法如何解决?

4

2 回答 2

3

问题是你的交替

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

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

改成这个

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

在 Regexr 上查看

那么你的号码将永远在第一组(因为只有一个)

于 2012-04-16T13:50:52.570 回答
1

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

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

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

/(?:wordA ?:? R?|wordB R)(\d+)/i
于 2012-04-16T13:54:08.347 回答