3

括弧を使用せずに正規表現の一部をグループ化することは可能ですか? または、言い換えれば、特定の括弧付きステートメントと一致しませんか? つまり、次の正規表現を考えてみましょう。

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

今。最初の 2 つのサブクエリ (縦棒のあるサブクエリ) に注目してください。それらが発生するのを防ぐにはどうすればよいですか?「彼は誰ですか」の場合$input、「彼」だけが一致するサブクエリになるようにします。

$matches[3]この例では、つかむだけで正しい結果が得られることを理解しています。ただし、アプリケーションの性質上、動的に正規表現を生成しているため、この例のような構造になるとは限りません。X 個の縦棒で区切られたサブクエリと、Y 個の(.+)サブクエリを持つことができます。私はそれらを一致させたいだけです(.+)

これを行うことは可能ですか?必要に応じて正規表現を書き直しても問題ありませんが、サブクエリをマークする括弧を使用せずにステートメントをグループ化する方法がわかりません。問題があれば、私はPHPを使用しています。

ありがとう!

4

1 に答える 1

4

次のように、最初の 2 つのグループ化で後方参照を削除できます。

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

?:開き丸かっこの後の は、このグループ化の後方参照を作成しないように正規表現エンジンに指示します。後方参照を使用する予定がない場合は常に、最適化のために含めることをお勧めします。

于 2012-08-16T15:51:42.813 に答える