假设我们有以下表达式
(?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)
该表达式使子表达式 counter 不会被交替的其他分支中的内容更改。它工作得很好。所以
(?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' 修饰符,并认为可以在表达式中的任何位置使用换行符。但事实证明你不能打破“?|” 部分不管使用的修饰符。