Перевод: сумасшедший технический ботаник
Отказ от ответственности: Воспроизведение запрещено без разрешения
Вы всегда хотели изучить регулярные выражения, но вас отталкивала их сложность? В этой статье я покажу вам пять простых в освоенииОбычныйтрюки, и вы можете сразу же использовать их в своем любимом текстовом редакторе.
Настройки текстового редактора
Хотя почти все текстовые редакторы теперь поддерживают регулярные выражения, я использую Visual Studio Code для этого руководства, но вы можете использовать любой редактор, который вам нравится. Также обратите внимание, что обычно вам нужно включить переключатель RegEx где-то рядом с полем ввода поиска. Вот как это сделать в VS Code:
Вам нужно включить RegEx, отметив эту опцию
1) .
— соответствует любому символу
Давайте начнем. запись через точку.
Чтобы соответствовать любому символу:
b.t
Регулярное выражение выше"bot"
, "летучая мышь"和任何以
b开头、
t结尾的三个字符的单词。但是如果你想搜索点符号,则需要用
`, чтобы избежать его, поэтому следующее регулярное выражение соответствует только точному тексту"b.t"
:
b\.t
2) .*
— соответствует чему угодно
здесь.
означает *"любой символ",*
выражать"Этот символ повторяет предыдущий любое количество раз." * соедините их (.*
) означает *"любой символ, повторяющийся любое количество раз".* Например, вы можете использовать это, чтобы найти совпадения, которые начинаются или заканчиваются некоторым текстом. Предположим, у нас есть такой метод javascript:
loadScript(scriptName: string, pathToFile: string)
Мы хотим найти все вызовы этого метода, гдеpathToFile
указать на папку“lua”
любой файл в формате . Можно использовать следующие регулярные выражения:
loadScript.*lua
это означает,"сопоставить все"loadScript"
начать с"lua"
конец строки. "
3) ?
— нежадное сопоставление
.*
После?
Символы и некоторые другие правила сопоставления означают «совпадение как можно меньше». На предыдущем изображении каждое совпадение получает дважды"lua"
строка до второго"lua"
Все можно сопоставить. Если вы хотите сопоставить первое вхождение"lua"
, вы можете использовать следующее регулярное выражение:
loadScript.*?lua
это означает,"сопоставить все"loadScript"
в начале, за которым следует любой символ до первого появления"lua"
loadScript.*?lua
: соответствует всему, что начинается с loadScript до первого вхождения "lua"
4) `( ) ### — захват групп и обратных ссылок
Хорошо, теперь мы можем сопоставить некоторый текст. Но что, если мы хотим изменить часть найденного нами текста? Здесь используются группы захвата.
Предположим, мы модифицируемloadScript
метод, теперь необходимо вставить еще один параметр между его исходными двумя параметрами. Назовем этот новый параметрid
, новый прототип функции должен выглядеть так:loadScript(scriptName,id,pathToFile)
. Здесь мы не можем использовать обычную функцию замены текстового редактора, но регулярные выражения могут нам помочь.
На изображении выше вы можете увидеть результат выполнения следующего регулярного выражения:
loadScript\(.*?,.*?\)
это означает:"совпадать с"loadScript("
в начале, а затем что-нибудь до первого,
, то ничего до первого)
"
Единственное, что может показаться вам странным, это\
символ. Они используются для экранирования скобок.
Потому что символ(
а также)
является регулярным выражением для захвата специальных символов, которые соответствуют частям текста, но нам нужно сопоставить фактические символы квадратных скобок, поэтому их нужно экранировать.
В предыдущем выражении мы использовали.*?
Символ определяет два параметра вызова метода. Сделать каждый параметр отдельнымгруппа захвата, необходимо добавить до и после них соответственно(
а также)
символ:
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]
будет соответствовать обоим.
Вы также можете использовать после класса символов*
, как в.
То же, что и после, что в данном случае означает:"соответствует любому количеству символов в этом классе"
постскриптум
Вы должны знать, что существует несколько способов написания регулярных выражений. Я говорю здесь о движке javascript RegEx. Большинство современных двигателей похожи, но могут быть и некоторые отличия. Обычно эти различия включают escape-символы и токены обратной ссылки.
Вы можете прямо сейчас открыть текстовый редактор и сразу же начать использовать некоторые из этих советов. Вы увидите, что многие задачи рефакторинга можно выполнять быстрее, чем раньше. Как только вы овладеете этими навыками,Пришло время начать работать над дополнительными регулярными выражениями.