【问题标题】:Regex - Reset numbering of submatches正则表达式 - 重置子匹配编号
【发布时间】:2012-12-08 18:51:21
【问题描述】:

假设我们有以下表达式

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

【问题讨论】:

    标签: php regex notepad++


    【解决方案1】:

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

    编辑:刚刚在 PHP 5.3.15 中尝试过,它可以工作。

    【讨论】:

    • 感谢您的确认!
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多