正则表达式 - 重置子匹配编号

时间:2012-12-08 18:51:21

标签: php regex notepad++

假设我们有以下表达式

(?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'修饰符并认为它可以在表达式的任何位置使用换行符。但事实证明你不能打破“?|”无论使用哪种修饰语,都可以使用。

1 个答案:

答案 0 :(得分:3)

subpatterns in PCRE的文档表示支持。该页面底部有一个示例。

编辑 刚刚在PHP 5.3.15中尝试过,它可以正常运行。