使用函数解析函数参数的正则表达式

2023-12-10

我想获取字符串的函数参数。

sample( 5*5 ) euros

这适用于:

([^\s\)]+)\(([^\)]+)\)

演示在这里.

问题是当我将另一个函数放入参数中时:

sample( decimal( 5*5 ) ) euros

仅适用于以下功能:

([^\s\)]+)\((.+)\)

演示在这里.

但是对于两个或更多函数,我无法获取函数参数:

sample( decimal( 5*5 ) ) toString(euros)

如何使用正则表达式获取函数参数?


如果你正在写一个parser你可以不用正则表达式。从教育的角度来看,在 PHP PCRE 正则表达式中,您可以使用递归 and 子程序调用.

看一下

(?<name>[^\s()]+)(\((?<body>(?>[^()]++|(?2))*)\))

See the 正则表达式演示

“name”组将包含函数名称,“body”组将包含匹配括号内的内容。

请注意,您需要同时添加两者( and ) to the 否定字符类 (?<funcion>[^\s()]+)因为如果你有sample(decimal(3*3))该组将抓取子字符串直到) (sample(decimal)。因此,您需要排除两者( and ).

The (\((?<body>(?>[^()]++|(?2))*)\))部分是一个捕获组(ID=2)可以通过子例程调用进行递归(即“重复”、“扩展”多次)(?2).

它匹配

  • \(- 一个开放式圆形支架
  • (?<body>(?>[^()]++|(?2))*) - Group "body" that matches zero or more sequences of:
    • [^()]++- 1+ 个字符以外的字符( and ) or
    • (?2)- 整体\((?<body>(?>[^()]++|(?2))*)\)子模式
  • \)- 右括号

The (?2) 子程序调用必要性(与递归 with (?R))是由我们需要重复/递归模式的一部分这一事实决定的。

由于组 2 是一个“技术”捕获组,因此对于我们想要真正使用的部分使用命名捕获组可能是一个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用函数解析函数参数的正则表达式 的相关文章

随机推荐