Javascript 如果介于两者之间,则排除,但更复杂
因此,我试图创建regex,它将解析所有全局函数声明,存储在对象中,例如,像这样Javascript 如果介于两者之间,则排除,但更复杂,javascript,regex,Javascript,Regex,因此,我试图创建regex,它将解析所有全局函数声明,存储在对象中,例如,像这样consta=()=>{} 我做了这样的东西: 本次代码>
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解析器或至少类似的东西。谢谢,这真的很有帮助。谢谢,这真的很有帮助