Простые трюки с RegEx для начинающих

Всегда хотели изучить регулярные выражения, но вас отталкивала их сложность? В этой статье я покажу вам пять простых в освоении трюков с RegEx, которые вы можете сразу же начать использовать в своем любимом текстовом редакторе.

Настройка текстового редактора

Хотя сейчас почти любой текстовый редактор поддерживает регулярные выражения, в этом руководстве я буду использовать код Visual Studio, но вы можете использовать любой редактор, который вам нравится. Также обратите внимание, что обычно вам нужно включить RegEx где-то рядом с полем поиска. Вот как вы это делаете в VS Code:

1) . - Соответствие любому символу

Начнем с простого. Символ точки .соответствует любому символу:

b.t

Над RegEx матчей "bot”, "bat”и любое другое слово из трех символов, начинается с bи заканчивается в t. Но если вы хотите найти символ точки, вам нужно экранировать его с помощью \, поэтому это RegEx будет соответствовать только точному тексту "b.t":

b\.t

2). * - Совпадение с чем угодно

Здесь .означает «любой символ» и *означает «что - нибудь , прежде чем этот символ повторяется любое количество раз.» Вместе ( .*) они означают «любой символ любое количество раз». Вы можете использовать его, например, для поиска совпадений, начинающихся или заканчивающихся некоторым текстом. Предположим, у нас есть метод javascript со следующей подписью:

loadScript(scriptName: string, pathToFile: string)

И мы хотим найти все вызовы этого метода, которые pathToFileуказывают на любой файл в папке “lua”. Для этого вы можете использовать следующее регулярное выражение:

loadScript.*lua

Это означает, что «сопоставить весь текст, начинающийся с, “loadScript”за которым следует что-либо до последнего появления “lua”«

3)? - Нежадный матч

?Символ после того, как .*и некоторые другие последовательности RegEx означает «матч как можно меньше.» Если вы посмотрите на предыдущее изображение, вы увидите, что текст “lua”отображается дважды в каждом совпадении, и все до второго “lua”совпадало. Если вы хотите сопоставить все до первого вхождения "lua"вместо, вы должны использовать следующий RegEx:

loadScript.*?lua

Это означает, «сопоставить все, начиная с, "loadScript"за которым следует что-либо до первого вхождения "lua""

4) () $ - Группы захвата и обратные ссылки

Хорошо, теперь мы можем сопоставить текст. Но что, если мы захотим изменить части найденного текста? Для этого часто приходится использовать группы захвата.

Предположим, мы изменили наш loadScriptметод, и теперь ему внезапно требуется еще один аргумент, вставленный между двумя его аргументами. Давайте назовем этот новый аргумент id, так что новая функция подписи должна выглядеть следующим образом : loadScript(scriptName, id, pathToFile). Здесь мы не можем использовать обычную функцию замены нашего текстового редактора, но регулярное выражение - это именно то, что нам нужно.

Выше вы можете увидеть результат выполнения следующего регулярного выражения:

loadScript\(.*?,.*?\)

Это означает: «сопоставить все, начиная с, "loadScript("за которым следует все, что угодно до первого ,, затем следует все, что угодно до первого )»

Единственное, что здесь может показаться вам странным, - это \символы. Они используются для выхода из скобок.

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

В предыдущем регулярном выражении мы определили два аргумента вызова нашего метода с помощью .*?символов. Давайте сделаем каждый из наших аргументов отдельный захват группы путем добавления (и )символов вокруг них:

loadScript\((.*?),(.*?)\)

Если вы запустите этот RegEx, вы увидите, что ничего не изменилось. Это потому, что он соответствует одному и тому же тексту. Но теперь мы можем ссылаться на первый аргумент как $1и на второй аргумент как $2. Это называется обратной ссылкой, и она поможет нам сделать то, что мы хотим: добавить еще один аргумент в середине вызова:

Ввод поиска:

loadScript\((.*?),(.*?)\)

Это означает то же самое, что и предыдущее RegEx, но сопоставляет аргументы с группами захвата 1 и 2 соответственно.

Заменить ввод:

loadScript($1,id,$2)

Это означает «заменить каждый совпавший текст текстом, “loadScript(“за которым следует группа захвата 1, “id”группа захвата 2 и )». Обратите внимание, что вам не нужно использовать escape-скобки во вводе замены.

5) [] - Классы персонажей

Вы можете перечислить символы , которые вы хотите , чтобы соответствовать в позиции , определенной путем размещения [и ]символов вокруг этих символов. Например, класс [0-9]соответствует всем цифрам от 0 до 9. Вы также можете явно перечислить все цифры: [0123456789]- значение такое же. Вы также можете использовать тире с буквами, [a-z]будет соответствовать любому строчному латинскому символу, [A-Z]будет соответствовать любому прописному латинскому символу и [a-zA-Z]будет соответствовать обоим.

Вы также можете использовать *после класса символов, как после ., что в данном случае означает: «сопоставить любое количество вхождений символов в этом классе»

Последнее слово

Вы должны знать, что существует несколько разновидностей RegEx. Я обсуждал здесь движок javascript RegEx. Большинство современных двигателей похожи, но могут иметь некоторые отличия. Обычно эти различия включают в себя escape-символы и знаки обратных ссылок.

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

Спасибо, что дочитали мою статью до конца. Добавьте аплодисменты, если вы сочли это полезным, и подпишитесь на новые обновления. Я опубликую больше статей по регулярным выражениям, javascript и программированию в целом.