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