是否可以不使用括号将正则表达式的部分分组?或者,换句话说,与某些括号内的陈述不匹配?这就是我的意思-考虑以下正则表达式:
$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';
圆括号开头的?:告诉正则表达式引擎不要为该分组创建后向引用.每当您不打算使用反向引用时,都包括进行优化是很好的.