正则表达式:匹配并计数“ A”,并在计数后找到“ B”后停止

时间:2018-09-06 21:48:33

标签: regex pcre

看这个例子:

function(abc, innerFunction(1, 2), innerFunction(3, 4, 5))
        │                  │    │               │       ││
        │                  └────┘               └───────┘│
        └────────────────────────────────────────────────┘
        ↑                                                ↑
        Open                                         Close

我需要匹配整个(外部)function()。为此,我需要计算(的数量并在发现相同数量的)之后停止。通常,它需要一个硬编码的脚本(解析器)来实现它,但是由于正则表达式(在我的情况下为PCRE)非常灵活,因此无论如何都可以实现。

这是我当前的解决方案,仅匹配外部函数: https://regex101.com/r/Eh6o8D/1


出于我的真实目标,几乎可以肯定的是,我将通过硬编码来做到这一点。但是我决定发布它,因为它可能对其他开发人员有用,并且也可以在我的应用程序的其他上下文中使用。


编辑1 :这个问题是重复的,但是我们可以在这里学习以下内容:(?R)是PCRE的一项特殊功能,它将在这一点上递归整个正则表达式。因此,如果我们有/ab(?R)?/,它将无限地类似于/abababab.../

如果只需要递归特定的匹配组,则可以使用\g<n>(其中n是匹配组号)或\g<group>(其中group是匹配组名称)。因此,如果我们有/(ab)\g<1>+c/,它将限制为/abababab...c/

(?R)可以在这里解决我的问题。但这只会获取整个匹配项,因此,例如,我仍然需要获取每个参数的过程。

(?<function>\w+) \(            # Matches function name
    (?<parameters>             # Simple param type.
        (?<data>               # Simple data type: inner function or word (keep order!).
           (?R) |              # Or recursive this Regexp to match inner functions.
           \w+                 # Matches a simple word.
        )

        (                      # Match additional parameters:
            \s*,\s*            # Match comma, but skip spaces.
            \g<parameters>     # Recurse additional parameters.
        )*                     # Zero or more additional parameters.
    )?                         # Parameters are optional
\)

它将通过对函数名称和参数进行分组来解决我的问题,如您在https://regex101.com/r/uyq6yM/1上看到的那样,将内部函数捕获为可以在稍后使用的参数。仍然可以改进,但是就目前而言,这是可以接受的解决方案。

0 个答案:

没有答案