3

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

 $pattern = '/^(what|where|who) (are|is) (.+)$/i';
 preg_match($pattern, $input, $matches);

现在。注意前两个子查询——带有竖线的子查询。我如何防止那些出现?如果$input是“他是谁”,我希望“他”是唯一匹配的子查询。

我明白,在这个例子中,我可以抓住$matches[3],这会给我正确的结果。但是,由于我的应用程序的性质,我正在动态生成正则表达式,并且结构不会总是像我在这个示例中那样。我可以有 X 个竖线分隔的子查询和 Y(.+)个子查询。我只想匹配(.+)那些。

是否有可能做到这一点?如有必要,我可以重写我的正则表达式,但我不知道如何在不使用括号的情况下对语句进行分组,括号标记子查询。如果重要的话,我正在使用 PHP。

谢谢!

4

1 回答 1

4

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

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

?:圆括号后告诉正则表达式引擎不要创建此分组的反向引用。每当您不打算使用反向引用时,最好将其包括在内以进行优化。

于 2012-08-16T15:51:42.813 回答