JS RegExp捕获的单词后没有括号

时间:2018-07-30 16:54:57

标签: javascript regex matching

我正试图提出一个正则表达式来匹配不是函数开头的单词。 因此,它应该与所有内容都匹配,而不要跟在左括号之间。

文本后面的“内容”也不应放入结果的[0]元素中。因此,对于字符串test),结束符)不应成为匹配组的一部分,这就是为什么^([a-zA-Z][\w-]*)(\s|$|\|,))之类的东西不起作用的原因。

另一个问题是,函数名称可能包含破折号(因此[\w-]*)。

我的第一次尝试: new RegExp(/^([a-zA-Z][\w-]*)(?!\()/)

这将匹配单词中除最后一个字符以外的所有字符,因此匹配tes中的test(

下一次尝试是:new RegExp(/^([a-zA-Z][\w-]*)(?!\()\b/)

这不会与test(之类的东西匹配,但会与get-中的get-border(匹配,因为-是一个分词字符。

我猜我需要的是不是\b的“ -”,但不能捕获它?

一些例子可以使我想完成的事情更清楚:

  • foo(-> null
  • arg)-> arg
  • foo-bar(-> null
  • arg-> arg

此问题的动机:我想将foo(bar(argument))之类的文本拆分为令牌列表:['foo(', 'bar(', 'argument', ')', ')'],给定正则表达式FUNCTION_STARTARGUMENT(<问题),FUNCTION_END

伪代码:

while (line.length > 0) {
  regExp.some(r => {
    const match = line.match(r);
    if (match) {
      tokens.push(...);
      line = line.replace(r, '').trim();

      return true;
    }

    return false;
  });
}

不应依赖于正则表达式的顺序。

1 个答案:

答案 0 :(得分:1)

您可以使用表达式:

^[a-zA-Z]+(?=\)|$)
  • ^声明行首。
  • [a-zA-Z]+字母字符,大小写,一个或多个。
  • (?=\)|$)正向查找,匹配右括号)或行$的结尾。

您可以实时测试正则表达式here