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

使用嵌套函数(javascript)提取函数表示法的正则表达式,javascript,regex,Javascript,Regex,我试图从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捕获的一部分,因此它不匹配 我目前的

我试图从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]:

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

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

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

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

发件人:

如果要匹配后面不跟其他字符的字符,则必须使用负前瞻。在解释[character class][4]时,本教程解释了为什么不能使用反字符类来匹配后面不跟
u
q
。负前瞻提供了解决方案:
q(?!u)
。负先行结构是一对括号,左括号后跟问号和感叹号


为什么你有[^x]?
/\b[a-z]\(/g
基于规则是否有效?我正在保存f(x)之类的东西用于定义和表达式的速记。这意味着我永远无法拥有像x(x)这样的函数但我同意。另一种方法是:不要试图用正则表达式来做这件事,而是使用js解析器来提取函数调用图……啊,这是有道理的,我需要仔细阅读消费情况,我显然没有正确处理它。也感谢链接!
\b[a-z]\((?!x\))