Соответствие Word (), когда word нет (какое-то слово) - PullRequest
0 голосов
/ 15 февраля 2019

В частности, я хочу сопоставить функции в моем коде Javascript, которые не входят в набор общих стандартных функций Javascript.Другими словами, я хочу соответствовать пользовательским функциям.Я работаю со вкусом регулярных выражений в vim, но я не возражаю против поиска решений для других вариантов.

Насколько я понимаю, регулярное выражение сканирует строковые символы за символом, поэтому мыслит в терминах наборов символовможет быть проблематичным, даже если проблема кажется простой.Я пробовал использовать отрицательный взгляд, и, как вы могли ожидать, все, что нужно, это предотвратить сопоставление первого символа функций, которые я не хочу (например, onsole.log вместо console.log).

(?(?!(if)|(console\.log)|(function))\w+)\(.*\)

функция (meep, boop, doo, do)

JSON.parse (localStorage ["beards"])

console.log ("sldkfjls "+ dododo);

if (beepboop) {

BLAH.blah.somefunc (arge, arg, arg);

https://regexr.com/

Я хотел бы иметь возможность сканировать функцию и видеть, где она вызывает другие пользовательские функции.Нужно ли мне выполнять постобработку (то есть сопоставление с другим регулярным выражением) для совпадений, чтобы отклонить нежелательные совпадения, или есть ли способ сделать это в одном регулярном выражении?

1 Ответ

0 голосов
/ 15 февраля 2019

Основной рецепт для регулярного выражения, который соответствует всем словам, кроме foo (в синтаксисе регулярных выражений Vim):

/\<\%(foo\>\)\@!\k\+\>/

Обратите внимание, что отрицательное предпросмотр (\@!) нуждается в конечном утверждении(здесь: \>) сам по себе, во избежание исключения из него всего, что начинает с выражения!

Применяется к вашим примерам (исключая if (потенциально с пробелами)), console.log и function, оканчивающиеся на (), что дает:

\<\%(\%(if *\|console\.log\|function\)(\)\@!\(\k\|\.\)\+\>(.*)

Как вы, кажется, хотите включить всю цепочку объектов (поэтому JSON.parse вместо *)1019 *), фактическое совпадение включает в себя как ключевые слова (\k), так и точку.Есть одно осложнение: отрицательный прогноз будет фиксироваться на log() в console.log(), потому что там также совпадает утверждение границы ведущего ключевого слова (\<).Мы можем запретить это совпадение, также исключив точку непосредственно перед функцией;то есть, поместив \.\@<! между:

\<\%(\%(if *\|console\.log\|function\)(\)\@!\.\@<!\(\k\|\.\)\+\>(.*)

Это выделит только следующие вызовы:

JSON.parse(localStorage["beards"])
BLAH.blah.somefunc(arge, arg,arg);
foo.log(asdf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...