我想得到string的函数参数。
var a = prompt("ask user something", "")
if (a === null) {
alert(' Cancel pressed')
}
这适用于:
sample( 5*5 ) euros
问题是当我在参数中放入另一个函数时:
([^\s\)]+)\(([^\)]+)\)
只有一个功能适用于:
sample( decimal( 5*5 ) ) euros
但是有两个或更多函数我无法得到函数参数:
([^\s\)]+)\((.+)\)
如何使用正则表达式获取函数参数?。
答案 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))*)
- [^()]++
和(
或)
- 整个(?2)
子模式\((?<body>(?>[^()]++|(?2))*)\)
- 右括号 \)
子例程调用必要性(与递归与(?2)
相比)由我们需要重复/递归的事实决定模式的一部分。
由于第2组是“技术”捕获组,因此对于我们想要真正使用的部分使用命名捕获组可能是个好主意。