Исключить, если между, но более сложный - PullRequest
0 голосов
/ 03 октября 2019

Итак, я пытаюсь сделать регулярное выражение, которое будет анализировать все объявления глобальных функций, хранящихся в объектах, например, как это 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)

Итак, есть идеи, как исключить объявления внутренних функций?

Я пробовал смотреть в будущее (?!), Но мои эксперименты не дали желаемого результата.

1 Ответ

2 голосов
/ 03 октября 2019

Используйте многострочный оператор и измените свой внешний вид на якорь, например, так:

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

См. Вывод здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...