正则表达式提取带有嵌套函数(javascript)的函数表示法

Regex to extract function notation with nested functions (javascript)

本文关键字:函数 表示 javascript 嵌套 正则表达式 提取      更新时间:2023-09-26

我正在尝试从javascript中的字符串中提取函数表示法(所以我不能使用lookback),这里有一些例子:

  • f(2) 应匹配 f(
  • f(10)g(8) 应匹配 f( 和 g(
  • f(2+g(3)) 应匹配 f( 和 g(
  • f(2+g(sqrt(10))) 应该匹配 f( 和 g(
  • f(g(2)) 应匹配 f( 和 g(

现在我正在使用

/'b[a-z]'([^x]/g

因为我不想在它是一串字母(例如 sqrt)时才匹配,只有当只有一个字母然后是一个括号时。我遇到的问题是列表中的最后一个(嵌套函数)。( 不是 ''b 捕获的一部分,因此不匹配。

我目前的计划是在每个(使用类似的东西)后添加一个空格

input = input.replace(/'([^'s]/g, '( ');

它拆分了嵌套函数,以便 ''b 发挥作用 [变为 f( g( 3))],但在我开始弄乱输入字符串之前,我想我会在这里问是否有更好的方法。显然正则表达式不是我超级强的东西,但我正在努力学习,所以一个带有答案的解释将不胜感激(尽管我会采取任何我可以谷歌自己的指示!我不完全确定在这里搜索什么。

这里的要点是,[^x]是一个否定的字符类,它仍然匹配,在(使用符号,并防止重叠匹配。要检查下一个字符是否未x,请使用前瞻:

'b[a-z]'((?!x)
         ^^^^^

查看正则表达式演示

也许,只有当xf()g()中唯一的字母时,您才希望匹配失败:

'b[a-z]'((?!x'))

从 Regular-expressions.info:

如果你想匹配没有其他东西的东西,消极的展望是必不可少的。在解释 [字符类][4] 时,本教程解释了为什么不能使用否定字符类来匹配不后跟uq。负前瞻提供了解决方案:q(?!u) 。负前瞻构造是一对括号,左括号后跟问号和感叹号

我认为你只需要删除[^x]:

"f(g(2))".match(/'b[a-z]'(/g)
// ["f(", "g("]