RegExp:If-Clause是否可以捕获组?

问题描述

tl; dr:

我正在寻找一种方法,该方法基于PHP中以PCRE样式正则表达式为基础的开放序列语法的样式来匹配结束字符序列。

任务

我正在编写一个模块,以捕获编写的PHP代码中的所有可翻译字符串。该模块的职责之一是还要捕获代码中规定的所有翻译上下文。此上下文是选项数组的一部分。

在PHP(从5.4版开始)中,可以使用两种不同的样式来定义数组:
a)array(...)
b)[...]

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

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

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

(?(?=\1==\[)\]|\))部分翻译成“正常语言”:如果第一个捕获组的内容是一个方括号,则该模式应捕获一个方括号,否则需要一个方括号。

是否有可能实现这样的目标?任何帮助将不胜感激!

预先感谢
克里斯

解决方法

正则表达式的答案是

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

请参见regex demo

详细信息

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

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

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

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

说明

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

Regex demo

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...