RegExp:If子句是否可以捕获组? tl;博士:

RegExp:If子句是否可以捕获组? tl;博士:,regex,pcre,regex-lookarounds,regex-group,Regex,Pcre,Regex Lookarounds,Regex Group,我正在寻找一种方法,根据PHP中开头序列语法的样式,将结尾字符序列与PCRE样式的正则表达式相匹配 任务 我正在编写一个模块,从编写的PHP代码中捕获所有可翻译字符串。本模块的一项职责是捕获代码中规定的任何翻译上下文。此上下文作为选项数组的一部分提供 在PHP(afair从5.4版开始)中,有两种不同的样式可以定义数组: a) 数组(…) b) […] 现在我想编写一个能够识别这两种样式的正则表达式。模式应该能够正确匹配结束字符序列,这取决于为开始数组选择的样式 不幸的是,我找不到任何关于如何将

我正在寻找一种方法,根据PHP中开头序列语法的样式,将结尾字符序列与PCRE样式的正则表达式相匹配

任务 我正在编写一个模块,从编写的PHP代码中捕获所有可翻译字符串。本模块的一项职责是捕获代码中规定的任何翻译上下文。此上下文作为选项数组的一部分提供

在PHP(afair从5.4版开始)中,有两种不同的样式可以定义数组:
a)
数组(…)

b)
[…]

现在我想编写一个能够识别这两种样式的正则表达式。模式应该能够正确匹配结束字符序列,这取决于为开始数组选择的样式

不幸的是,我找不到任何关于如何将IF语句应用于给定捕获组的文档

理论上应该是这样的:
/。。。(数组\(\[)…(?(?=\1==\[)\]\)…/

(注意:上面一行中的“…”应该表示regex模式比这里所述的要长。这应该只是我试图实现的一个示例)

(?(?=\1==\[)\]\\)
部分翻译为“正常语言”:如果第一个捕获组的内容是一个开口方括号,则图案应捕获一个闭合方括号,否则需要一个闭合圆括号

有可能实现这样的目标吗?非常感谢您的帮助

提前感谢
克里斯

正则表达式的答案是

(?:array(\()|\[).*?(?(1)\)|])

详细信息

  • (?:数组(\()\\[)
    -在将
    捕获到组1中时与
    数组(
    匹配,或
    [
    字符)匹配的非捕获组
  • *?
    -除换行符以外的任何0个或更多字符,尽可能少
  • (?(1)\)|]
    -条件构造:如果组1匹配(组内存缓冲区中有
    字符),则
    必须在当前位置匹配,否则
    ]

如果要使用相同的捕获组捕获值,还可以使用分支重置组
(?|
参考组1获取值

要获取左括号和右括号或方括号之间的值,可以使用
[^
匹配除字符类中列出的字符以外的任何字符

(?|array(\([^()]*\))|(\[[^][]*]))
解释

  • (?|
    分支重置组
    • 数组
      按字面匹配
    • 捕获组1
      • \([^()]*\)
        匹配
        (…)
    • 关闭第1组
    • |
    • 捕获组2
      • \[^][]*]
        匹配
        […]
    • 关闭第2组
  • 关闭分支重置组

也许匹配任何一种格式的
array\([^()]*\)\124;\[^][]*]
会更容易些,尽管
[]
格式是一个非常广泛的匹配项。谢谢,但是这样我就无法在相同的引用中捕获数组内容。您可以使用带有分支的模式重置组来引用具有相同引用的捕获内容。哇。太棒了!正是我搜索的内容,非常感谢!