将函数调用与JS Regex匹配

时间:2015-01-27 09:32:44

标签: javascript regex

我正在尝试使用Regex匹配函数调用,但是没有给出大型JS文件,其中相同函数的嵌套调用在里面。例如,下面是JS文件中的代码

abc('hello', function(){
    abc('hello1', function(){
       abc('hello2', function() {
          // Does some!
       });
    });
});

我想只匹配第一个调用来识别第一个参数。我要找的最终结果是hello。所以像下面这样做以匹配第一个电话

.replace(/(?:\r\n|\r|\n)/g, '').match(/abc\s*[^\"\']*\"([^\"\']*)\"/); 

有什么建议吗?

1 个答案:

答案 0 :(得分:9)

您可以使用像Esprima这样的JS解析器来执行此操作。在我看来,这将是正确可靠的解决方案而不是神奇的正则表达式。正则表达式通常难以维护,并且通常会因边缘情况而失败。它们在某些情况下非常有用,但这不是其中之一。

要试用Esprima,请使用此工具:

Esprima Demo

并输入:

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"]