我试图从javascript中的字符串中提取函数符号(所以我不能使用lookbehind),这里有一些例子:
现在我正在使用
/\b[a-z]\([^x]/g
因为我不想匹配它是一串字母(例如sqrt),只有当有一个字母然后是圆括号时。我遇到的问题是列表中的最后一个(嵌套函数)。 (不是\ b捕获的一部分所以它不匹配。
我目前的计划是在每次之后添加一个空格(使用
之类的东西input = input.replace(/\([^\s]/g, '( ');
分割嵌套函数以便\ b进入播放[变成f(g(3))]但是在我开始搞乱输入字符串之前,我想我会问这里是否有更好的方法来做。显然正则表达式不是我超强的东西,但我正在努力学习,所以对答案的解释将不胜感激(虽然我会采取任何指针,我也可以谷歌自己!我不完全确定在这里搜索什么。)
答案 0 :(得分:1)
这里的要点是[^x]
是一个否定的字符类仍然匹配,消费 (
之后的符号,它可以防止重叠匹配。要检查下一个字符是否为x
,请使用前瞻:
\b[a-z]\((?!x)
^^^^^
请参阅regex demo
也许,只有当x
是f()
或g()
内的唯一字母时,您才想让匹配失败:
\b[a-z]\((?!x\))
否定前瞻是必不可少的,如果你想匹配其他东西没有的东西。在解释[字符类] [4]时,本教程解释了为什么不能使用否定字符类来匹配
q
后跟u
。否定前瞻提供了解决方案:q(?!u)
。负前瞻构造是括号对,左括号后跟一个问号和一个感叹号。
答案 1 :(得分:0)
我认为你只需删除[^ x]:
"f(g(2))".match(/\b[a-z]\(/g)
// ["f(", "g("]