Php 在不带括号的正则表达式中分组垂直条分隔的选项?

Php 在不带括号的正则表达式中分组垂直条分隔的选项?,php,regex,backreference,Php,Regex,Backreference,是否可以在不使用括号的情况下对正则表达式的部分进行分组?或者,换句话说,与某些附加说明不匹配?我的意思是——考虑以下正则表达式: $pattern = '/^(what|where|who) (are|is) (.+)$/i'; preg_match($pattern, $input, $matches); 现在。请注意前两个子查询——带有竖条的子查询。我如何防止这些问题出现?如果$input是“他是谁”,我希望“他”是唯一匹配的子查询 我知道,在这个例子中,我可以抓取$matches[3

是否可以在不使用括号的情况下对正则表达式的部分进行分组?或者,换句话说,与某些附加说明不匹配?我的意思是——考虑以下正则表达式:

 $pattern = '/^(what|where|who) (are|is) (.+)$/i';
 preg_match($pattern, $input, $matches);
现在。请注意前两个子查询——带有竖条的子查询。我如何防止这些问题出现?如果
$input
是“他是谁”,我希望“他”是唯一匹配的子查询

我知道,在这个例子中,我可以抓取
$matches[3]
,这样就可以得到正确的结果。然而,由于我的应用程序的性质,我动态地生成正则表达式,并且结构并不总是像我在本例中所拥有的那样。我可以有X个垂直条分隔的子查询,Y个
(.+)
子查询。我只想匹配那些
(.+)

有可能这样做吗?如果必要的话,我可以重写正则表达式,但是如果不使用括号(用于标记子查询)的话,我不知道如何对语句进行分组。如果有必要的话,我正在使用PHP


谢谢

您可以消除前两组中的反向引用,如下所示:

$pattern = '/^(?:what|where|who) (?:are|is) (.+)$/i';

开头的圆括号后面的
?:
告诉正则表达式引擎不要创建此分组的反向引用。当你不打算使用backreference时,最好包括优化。

这可能是我见过的最性感的解决方案。我不知道这是可能的!有关正则表达式语法及其工作原理的更多详细信息,我强烈建议使用此方法。