带函数的解析函数参数的正则表达式

时间:2016-07-18 06:41:35

标签: regex

我想得到string的函数参数。

 var a = prompt("ask user something", "")
    if (a === null) {
      alert(' Cancel pressed')
    }

这适用于:

sample( 5*5 ) euros

Demo here

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

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

只有一个功能适用于:

sample( decimal( 5*5 ) ) euros

Demo here

但是有两个或更多函数我无法得到函数参数:

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

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

2 个答案:

答案 0 :(得分:1)

使用前瞻指定下一个括号char(如果有)是 open ,并使用一个不情愿的量词。

这应该有效:

([^\s\)]+)\((.+?)\)(?=[^()]*(\(|$))

答案 1 :(得分:1)

如果您正在编写解析器,则可以不使用正则表达式。从教育的角度来看,在PHP PCRE正则表达式中,您可以使用递归子例程调用

看看

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

请参阅regex demo

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

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

(\((?<body>(?>[^()]++|(?2))*)\))部分是一个捕获组( ID = 2 ),可以通过子程序调用{​​{1}递归(即“重复”,“展开”多次) }}

匹配

  • (?2) - 一个开放的圆括号
  • \( - 匹配零个或多个序列的组“正文”:
    • (?<body>(?>[^()]++|(?2))*) - [^()]++(
    • 以外的1个字符
    • ) - 整个(?2)子模式
  • \((?<body>(?>[^()]++|(?2))*)\) - 右括号

\) 子例程调用必要性(与递归(?2)相比)由我们需要重复/递归的事实决定模式的一部分。

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