我正试图提出一个正则表达式来匹配不是函数开头的单词。 因此,它应该与所有内容都匹配,而不要跟在左括号之间。
文本后面的“内容”也不应放入结果的[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_START
,ARGUMENT
(<问题),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;
});
}
不应依赖于正则表达式的顺序。
答案 0 :(得分:1)
您可以使用表达式:
^[a-zA-Z]+(?=\)|$)
^
声明行首。[a-zA-Z]+
字母字符,大小写,一个或多个。(?=\)|$)
正向查找,匹配右括号)
或行$
的结尾。您可以实时测试正则表达式here。