我正在尝试使用Regex匹配函数调用,但是没有给出大型JS文件,其中相同函数的嵌套调用在里面.例如,下面是JS文件中的代码
abc('hello', function(){
abc('hello1', function(){
abc('hello2', function() {
// Does some!
});
});
});
Run Code Online (Sandbox Code Playgroud)
我想只匹配第一个调用来识别第一个参数.我正在寻找的最终结果是hello.所以像下面这样匹配第一个电话
.replace(/(?:\r\n|\r|\n)/g, '').match(/abc\s*[^\"\']*\"([^\"\']*)\"/);
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
您可以使用像Esprima这样的JS解析器来执行此操作.在我看来,这将是正确可靠的解决方案而不是神奇的正则表达式.正则表达式通常难以维护,并且通常会因边缘情况而失败.它们在某些情况下非常有用,但这不是其中之一.
要试用Esprima,请使用此工具:
并输入:
abc('hello', function(){
abc('hello1', function(){
abc('hello2', function() {
/* ... */
});
});
});
abc('hello3', function(){
abc('hello4', function(){
abc('hello5', function() {
/* ... */
});
});
});
Run Code Online (Sandbox Code Playgroud)
然后过滤返回的JSON以仅查找第一个"级别"函数及其第一个参数:
JSON.body.filter(function(token) {
return token.type === 'ExpressionStatement' && token.expression.type ===
'CallExpression' && token.expression.callee.name === "abc"
}).map(function(funcToken) {
return funcToken.expression.arguments[0].value
})
Run Code Online (Sandbox Code Playgroud)
在示例中,返回的是:
["hello", "hello3"]
Run Code Online (Sandbox Code Playgroud)