Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果介于两者之间,则排除,但更复杂_Javascript_Regex - Fatal编程技术网

Javascript 如果介于两者之间,则排除,但更复杂

Javascript 如果介于两者之间,则排除,但更复杂,javascript,regex,Javascript,Regex,因此,我试图创建regex,它将解析所有全局函数声明,存储在对象中,例如,像这样consta=()=>{} 我做了这样的东西: 本次代码>

因此,我试图创建regex,它将解析所有全局函数声明,存储在对象中,例如,像这样
consta=()=>{}

我做了这样的东西:

本次代码><<码><<码>>/////(代码:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::(\“\'\\
)*)*\}/g

它工作得很好,但是我在内部声明方面遇到了问题()

如果链接不起作用:

const definedJsFunctionsAsObjectRegex = /(?:const|let|var)\s*([A-z0-9]+)?\s*=\s(function\s*\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)|\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\=\>)\s*\{((?:[^}{]+|\{[^}{]*\}|[^}]|\}(\"|\'|\`))*)*\}/g;

const str = `
let f = function(a,b) {
  console.log(gdhfsgdfg);
}

const f2 = (a,b,   d) => { blabla }

let f3 = function(){
  fdgdhgf
}

function test() {
    const inner = (t, b) => { im must be undetected}
    const inner2 = function (a,b) {
        im must be undetected too
    }
}

// here checking for }"
function(fds) { obj = {} return "}" }

function r () { obj = {}; a = []; }

function a(){console.log('a')} function b(){console.log('b')}
`;

let matches = [...str.matchAll(definedJsFunctionsAsObjectRegex)];
console.log(matches)
那么,如何排除内部函数声明呢


我尝试过反向前瞻(?),但我的实验没有给出预期的结果。

使用多行操作符,将您的前瞻更改为锚定,如下所示

/^(const|let|var)\s*([A-z0-9]+)?\s*=\s(function\s*\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)|\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\=\>)\s*\{((?:[^}{]+|\{[^}{]*\}|[^}]|\}(\"|\'|\`))*)*\}/gm

查看输出

使用多行操作符并将查找更改为类似以下的锚点

/^(const|let|var)\s*([A-z0-9]+)?\s*=\s(function\s*\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)|\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\=\>)\s*\{((?:[^}{]+|\{[^}{]*\}|[^}]|\}(\"|\'|\`))*)*\}/gm

请参阅输出

为什么要用正则表达式解析JS代码?只是为了实验,您的实验应该表明正则表达式对这项工作很糟糕。您应该使用AST解析器或至少类似的工具。为什么要用正则表达式解析JS代码?只是为了实验,您的实验应该表明正则表达式对这项工作很糟糕。您可以应该使用AST解析器或至少类似的东西。谢谢,这真的很有帮助。谢谢,这真的很有帮助