【问题标题】:RegExp: If-Clause for capturing group possible?RegExp:用于捕获组的 If-Clause 可能吗?
【发布时间】:2020-08-22 11:26:40
【问题描述】:

tl;博士:

我正在寻找一种方法来匹配基于 PHP 中的开始序列语法风格的结束字符序列与 PCRE 风格的正则表达式。

任务

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

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

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

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

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

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

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

提前致谢
克里斯

【问题讨论】:

  • 也许匹配array\([^()]*\)|\[[^][]*] 中的任何一种格式是一种更简单的方法,尽管[] 格式是一个非常广泛的匹配。 regex101.com/r/9uPIiZ/1
  • 谢谢,但是这样我将无法在相同的引用中捕获数组内容
  • 您可以使用带有分支重置组的模式来引用具有相同引用的捕获内容。

标签: regex pcre regex-lookarounds regex-group


【解决方案1】:

正则表达式的答案是

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

regex demo

详情

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

【讨论】:

  • 哇。棒极了!正是我要找的,非常感谢!
【解决方案2】:

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

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

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

说明

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

Regex demo

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 2012-06-07
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2015-05-10
    相关资源
    最近更新 更多