问题描述
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组
-
-
)
关闭分支重置组