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

时间:2016-01-28 23:38:17

标签: javascript regex

我试图从javascript中的字符串中提取函数符号(所以我不能使用lookbehind),这里有一些例子:

  • 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))]但是在我开始搞乱输入字符串之前,我想我会问这里是否有更好的方法来做。显然正则表达式不是我超强的东西,但我正在努力学习,所以对答案的解释将不胜感激(虽然我会采取任何指针,我也可以谷歌自己!我不完全确定在这里搜索什么。)

2 个答案:

答案 0 :(得分:1)

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

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

请参阅regex demo

也许,只有当xf()g()内的唯一字母时,您才想让匹配失败:

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

来自Regular-expressions.info

  

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

答案 1 :(得分:0)

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

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