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

0
502
views

Перевод статьи «Simple RegEx tricks for beginners».

RegEx для начинающих

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

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

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

Включение RegEx
Включение RegEx

1. Точка представляет любой символ (причем один)

Начнем с простого. Символ точки в регулярном выражении обозначает любой символ.

b.t
Применение точки в регулярном выражении

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

b\.t
Экранирование точки
Экранирование точки

2. Точка со звездочкой могут представлять любые символы в любом количестве

В этом сочетании точка означает «один любой символ», а звездочка означает, что символ, стоящий перед ней, может повторяться любое количество раз. Это сочетание можно применять, например, если вам нужно найти строки, в которых вам известно начало или конец. Предположим, у нас есть метод JavaScript со следующей сигнатурой:

loadScript(scriptName: string, pathToFile: string)

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

loadScript.*lua

Расшифровывается это так: «Найди совпадение с любым текстом, начинающимся с «loadScript» и заканчивающимся на «lua», причем между указанными началом и концом может идти что угодно».

3. Вопросительный знак — «не жадное» совпадение

Вопросительный знак, стоящий после .* (точки со звездочкой) и некоторых других последовательностей RegEx, означает «найди как можно меньшее совпадение».

Если вы внимательно посмотрите на предыдущий пример, вы увидите, что в каждой строке, совпавшей с регулярным выражением, слово «lua» встречалось дважды, однако в качестве совпадения была выведена вся строка, по второе вхождение «lua».

Но если вам нужно, чтобы регулярное выражение совпадало со строками только в части, заканчивающейся первым вхождением «lua», написать его можно так:

loadScript.*?lua

Это регулярное выражение означает: «Найди совпадение с любой строкой, начинающейся с «loadScript» и заканчивающейся первым вхождением «lua», а между началом и концом могут быть любые другие символы».

4. Группирование символов

Окей, теперь мы можем искать совпадения. Но что, если нам нужно не только найти, но и изменить части найденного текста? Здесь нам пригодится группирование символов.

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

loadScript(scriptName, id, pathToFile)

Мы не можем воспользоваться обычным функционалом замены в нашем редакторе, но регулярное выражение способно нам помочь.

loadScript(.*?,.*?)

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

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

Расшифровывается оно так: «Найди любую строку, начинающуюся с текста «loadScript(», за которым идут любые другие символы до первого вхождения символа запятой, после чего идет что угодно до первого вхождения закрывающей скобки».

Единственное, что здесь может выглядеть странно, это обратные слэши (\) — они служат для экранирования скобок.

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

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

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

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

В окне поиска вводим

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

Это такой же поиск, как и с предыдущим выражением, только аргументы представлены в виде групп 1 и 2.

В окне замены вводим

loadScript($1,id,$2)

Это означает «Замени найденный текст текстом «loadScript(», за которым идет группа 1, «id», группа 2 и закрывающая скобка».

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

Результат замены

5. Классы символов

Если какой-то символ может быть представлен, к примеру, любой цифрой, любой строчной буквой, любой цифрой из диапазона, то есть, любым символом определенного класса, можно указать варианты допустимых символов и окружить их квадратными скобками.

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

После указания класса символов можно использовать звездочку (как мы уже делали в сочетании точки и звездочки). Тогда такое выражение будет означать «любое число вхождений символов из этого класса».

expect.*to.equal\([0–9]*\)

Послесловие

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

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

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here