RegExp: If-Clause for capturing group 可能吗?

RegExp: If-Clause for capturing group possible?

tl;博士:

我正在寻找一种方法,根据 PHP 中开始序列语法的样式,使用 PCRE 样式的正则表达式来匹配结束字符序列。

任务

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

在PHP中(从5.4版本开始),有两种不同的风格可以定义一个数组:
一)array(...)
b) [...]

我现在想编写一个能够识别两种样式的正则表达式。该模式应该能够根据选择的启动数组的样式正确匹配结束字符序列。

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

理论上应该是这样的:
/ ... (array\(|\[) ... (?(?===\[)\]|\)) ... /
(注意:上一行中的“...”应该表示正则表达式模式比此处所述的要长。这应该仅作为我要实现的目标的示例)

翻译成“普通语言”的(?(?===\[)\]|\))部分:如果第一个捕获组的内容是一个左方括号,那么模式应该捕获一个右方括号,否则需要一个右圆括号.

有没有可能实现这样的目标?非常感谢任何帮助!

提前致谢
克里斯

正则表达式答案是

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

regex demo

详情

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

如果您想使用相同的捕获组捕获值,您还可以使用分支重置组 (?| 来引用组 1 的值。

要获取左括号和右括号或方括号之间的值,您可以使用 negated character class [^ 来匹配字符 class 中列出的字符以外的任何字符。

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

说明

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

Regex demo