首页 > 解决方案 > 排除 if between,但更复杂

问题描述

所以,我正在尝试制作正则表达式,它将解析所有全局函数声明,存储在对象中,例如,像这样const a = () => {}

我做了这样的事情:

/(?:const|let|var)\s*([A-z0-9]+)?\s*=\s(function\s*\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)|\(([^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)\s*\=\>)\s*\{((?:[^}{]+|\{[^}{]*\}|[^}]|\}(\"|\'|\ ))*)*\}/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)

那么,有什么想法,如何排除内部函数声明?

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

标签: javascriptregex

解决方案


使用多线运算符并将您的后视更改为像这样的锚

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

在此处查看输出


推荐阅读