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)\)|])
详情
(?:array(\()|\[)
- 匹配 array(
的 non-capturing 组,同时将 (
捕获到第 1 组,或 [
char
.*?
- 除换行字符外的任何 0 个或多个字符尽可能少
(?(1)\)|])
- 条件构造:如果第 1 组匹配((
字符在组内存缓冲区中),)
必须在当前位置匹配,否则 ]
.
如果您想使用相同的捕获组捕获值,您还可以使用分支重置组 (?|
来引用组 1 的值。
要获取左括号和右括号或方括号之间的值,您可以使用 negated character class [^
来匹配字符 class 中列出的字符以外的任何字符。
(?|array(\([^()]*\))|(\[[^][]*]))
说明
(?|
分支重置组
array
字面匹配
(
捕获组 1
\([^()]*\)
匹配 (...)
)
关闭组 1
|
或
(
捕获组 2
\[[^][]*]
匹配 [...]
)
关闭组 2
)
关闭分支重置组
tl;博士:
我正在寻找一种方法,根据 PHP 中开始序列语法的样式,使用 PCRE 样式的正则表达式来匹配结束字符序列。
任务
我正在编写一个模块来从编写的 PHP 代码中捕获所有可翻译的字符串。该模块的一项职责是还捕获代码中声明的任何翻译上下文。此上下文作为选项数组的一部分提供。
在PHP中(从5.4版本开始),有两种不同的风格可以定义一个数组:
一)array(...)
b) [...]
我现在想编写一个能够识别两种样式的正则表达式。该模式应该能够根据选择的启动数组的样式正确匹配结束字符序列。
遗憾的是,我找不到任何关于如何将 IF 语句应用于给定捕获组的文档。
理论上应该是这样的:
/ ... (array\(|\[) ... (?(?===\[)\]|\)) ... /
(注意:上一行中的“...”应该表示正则表达式模式比此处所述的要长。这应该仅作为我要实现的目标的示例)
翻译成“普通语言”的(?(?===\[)\]|\))
部分:如果第一个捕获组的内容是一个左方括号,那么模式应该捕获一个右方括号,否则需要一个右圆括号.
有没有可能实现这样的目标?非常感谢任何帮助!
提前致谢
克里斯
正则表达式答案是
(?:array(\()|\[).*?(?(1)\)|])
详情
(?:array(\()|\[)
- 匹配array(
的 non-capturing 组,同时将(
捕获到第 1 组,或[
char.*?
- 除换行字符外的任何 0 个或多个字符尽可能少(?(1)\)|])
- 条件构造:如果第 1 组匹配((
字符在组内存缓冲区中),)
必须在当前位置匹配,否则]
.
如果您想使用相同的捕获组捕获值,您还可以使用分支重置组 (?|
来引用组 1 的值。
要获取左括号和右括号或方括号之间的值,您可以使用 negated character class [^
来匹配字符 class 中列出的字符以外的任何字符。
(?|array(\([^()]*\))|(\[[^][]*]))
说明
(?|
分支重置组array
字面匹配(
捕获组 1\([^()]*\)
匹配(...)
)
关闭组 1|
或(
捕获组 2\[[^][]*]
匹配[...]
)
关闭组 2
)
关闭分支重置组