Javascript 将函数调用与JS Regex匹配

Javascript 将函数调用与JS Regex匹配,javascript,regex,Javascript,Regex,我正在尝试使用正则表达式匹配函数调用,但在同一个函数的嵌套调用位于其中的大JS文件上没有给出。下面的示例是JS文件中的代码 abc('hello', function(){ abc('hello1', function(){ abc('hello2', function() { // Does some! }); }); }); 我只想匹配第一个调用来识别第一个参数。我要寻找的最终结果是hello。所以,请按照下面的方法来匹配第一

我正在尝试使用正则表达式匹配函数调用,但在同一个函数的嵌套调用位于其中的大JS文件上没有给出。下面的示例是JS文件中的代码

abc('hello', function(){
    abc('hello1', function(){
       abc('hello2', function() {
          // Does some!
       });
    });
});
我只想匹配第一个调用来识别第一个参数。我要寻找的最终结果是
hello
。所以,请按照下面的方法来匹配第一个呼叫

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

有什么建议吗?

您可以使用像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"]

您可以使用像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"]

为什么要否决投票?唐弗特先生,你能不能规矩点,解释一下唐弗特的原因?我没有唐弗特,但一般认为在这种工作中使用正则表达式是个坏主意。特别是由于输入数据的嵌套/递归性质。你最好找一个能准确解释JavaScript的库,JavaScript(而不是一个巨大的字符串)让你做你需要做的事情。为什么要否决投票?唐弗特先生,你能不能规矩点,解释一下唐弗特的原因?我没有唐弗特,但一般认为在这种工作中使用正则表达式是个坏主意。特别是由于输入数据的嵌套/递归性质。您最好寻找一个库,该库将JavaScript准确地解释为JavaScript(而不是一个巨大的字符串),让我们来做您需要做的事情。