同一模式上的正则表达式多个捕获组

时间:2015-05-12 16:46:13

标签: php regex preg-match-all capture regex-group

假设我有一个字符串:

12345678

我也有以下模式:

/^.*$/
/^[0-9]+$/

这两种模式都匹配字符串。我想知道两种模式都匹配字符串。我可以循环遍历每个模式并投入preg_match,但这太慢了。

我希望能够做到这样的事情:

preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches);

然而,这会给我一些类似的东西:

[
    'pattern1' => '12345678',
    'pattern2' => ''
]

如您所见,pattern2显示为空,因为模式1已经捕获了字符串。

我如何编写preg_match_all正则表达式,以便pattern1和pattern2(以及任何其他模式)都有机会匹配相同的字符串?但是,如果只有所有模式匹配,我不会遵循正则规则返回所有模式。我希望它返回所有匹配的模式和所有不匹配的模式。

修改

进一步澄清,

我作为例子给出的模式只是例子。

在我的实际场景中,将会有未知数量的模式匹配未知字符串。

循环使用foreach的原因太慢了因为我将使用数千个字符串循环遍历数十个模式。如果可以将每个字符串有效地组合成一个规则,我可以通过有多少模式来加速这部分代码。

1 个答案:

答案 0 :(得分:1)

您可以使用以下技巧:

^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$

因为pattern2在pattern1内部并且由|分隔..每个字符都会检查两个匹配项。

请参阅DEMO