1

次の式があるとしましょう

(?x) ((a  b) (c) | (d) (e f) | (g) h (i) )

次の後方参照を取得します。

\1 abc, def, ghi
\2 ab
\3 c
\4 d
\5 ef
\6 g
\7 i

Notepad++ 正規表現エンジンは素晴らしい構造をサポートしています:

(?|expression using the alternation | operator)

その式は、代替の他のブランチにあるものによって部分式カウンターが変更されないようにします。それは完全に正常に動作します。そう

(?x) (?| (a  b) (c) | (d) (e f) | (g) h (i) )

次のグループを作成します

\1 ab, d, g
\2 c, ef, i

しかし、PHP でこの構成を使用しようとすると、エラーが発生しました。

警告: preg_match_all(): コンパイルに失敗しました: (? または (?- のオフセット 11 の後に文字が認識されません ...

では、PHP で (前述の構成のように) 代替の異なるブランチに同じ番号を付けることは可能ですか?


ソリューション

問題は、「?」の間に改行を入れたことです。と '!'。「x」修飾子を使用して、式のどこでも改行を使用できると考えました。しかし、結局のところ、「?|」を壊すことはできません。使用される修飾子に関係なく、部分。

4

1 に答える 1

3

PCRE のサブパターンのドキュメントには、サポートされていると書かれています。そのページの下部に例があります。

編集: PHP 5.3.15で試してみたところ、動作しました。

于 2012-12-08T19:03:08.640 に答える