看这个例子:
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上看到的那样,将内部函数捕获为可以在稍后使用的参数。仍然可以改进,但是就目前而言,这是可以接受的解决方案。