Php Regex在同一模式上有多个捕获组
假设我有一个字符串:Php Regex在同一模式上有多个捕获组,php,regex,preg-match-all,capture,regex-group,Php,Regex,Preg Match All,Capture,Regex Group,假设我有一个字符串: 12345678 我还有以下几种模式: /^.*$/ /^[0-9]+$/ 这两种模式都与字符串匹配。我想找出两种模式都匹配字符串。我可以在每个模式中循环并抛出一个preg\u匹配,但这太慢了 我希望能够做到以下几点: preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches); 正如您所看到的,pattern2是空的,因为Pattern1已经捕获
12345678
我还有以下几种模式:
/^.*$/
/^[0-9]+$/
这两种模式都与字符串匹配。我想找出两种模式都匹配字符串。我可以在每个模式中循环并抛出一个preg\u匹配
,但这太慢了
我希望能够做到以下几点:
preg_match_all('/^(?P<pattern1>.*)|(?P<pattern2>[0-9]+)$/', $string, $matches);
正如您所看到的,pattern2是空的,因为Pattern1已经捕获了字符串
如何编写我的preg\u match\u all
regex,以便pattern1和pattern2(以及任何其他模式)都有机会匹配相同的字符串?然而,我并不想要一个正则表达式规则,如果所有模式都匹配,它将返回所有模式。我希望它返回所有匹配的模式和所有不匹配的模式
编辑
只是为了进一步澄清,
我作为例子给出的模式只是例子
在我的实际场景中,将有未知数量的模式匹配未知字符串
在foreach中循环太慢的原因是,我将使用数千个字符串在几十个模式中循环。如果每个字符串可以有效地组合成一个规则,我可以通过有多少个模式来加速这部分代码。您可以使用以下技巧:
^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$
^(?P(?P^[0-9]+$)|*)$
因为pattern2位于pattern1内部,由|
分隔。。将检查两个匹配项的每个字符
请参见“太慢”是什么意思?你用这个做什么?这些是你正在检查的模式,还是仅仅是这个问题的一个简单例子?如果这些是实际的模式,那么只需检查strlen()和is͢int()的值,而不是使用正则表达式,性能就会更好。@Ja͢ck我将其用作高性能url路由器的一部分。我知道FastRoute存在,但即使缓存FastRoute,我的解决方案的平均速度也已经提高了1.5倍。我需要这些模式的部分是唯一的瓶颈,因为foreach在这些模式上的循环花费了太多的时间。@CJWurtz这些模式只是简单的例子。实际上,模式将由库的用户定义,并且对它们可以匹配的内容没有限制;这不是正则表达式匹配的目的,问题是顺序很重要;如果您切换这两个模式并创建一个字符串,如
“a12345678”
,您将获得错误的匹配项。如果“a12345678”
匹配项应该是什么?无论您以何种顺序提供模式,一个匹配项都应为空。如果您交换模式,则该匹配项不为空,即,^.*$
作为内部模式,\d+
作为替代模式。是。。子集应位于内部块中。。这就是为什么我这样写正则表达式。。为什么要交换模式呢?具体问题有一定的解决办法。。更改同一问题的解决方案可能并不总是有效。。
^(?P<pattern1>(?P<pattern2>^[0-9]+$)|.*)$