Простые регулярные выражения помогают искать и проверять строки по шаблону. В материале последовательно разобраны метасимволы, якоря, классы символов, группы и квантификаторы.
Диалекты регулярных выражений отличаются. Примеры статьи близки к POSIX-подобному синтаксису; перед использованием проверяйте поддержку конкретной конструкции в RouterOS, shell, редакторе или языке программирования.
Сразу в бой
Не сильно углубляясь, только поверхностно.
Любой символ (.)
Предположим что у нас есть строка ятакустал.vasilevkirill.ru и нам необходимо убедиться в том, что в данной строке присутствует домен vasilevkirill.ru.
Регулярное вырождение будет следующим vasilevkirill\.ru первое, что бросается в глаза это обратный слэш, в regexp много специальных символов, и если вам необходимо именно выбрать спец символ, то его необходимо экранировать.
Точка обозначает любой символ например если не экранировать точку, то под запрос попадёт и такая запись ятакустал.vasilevkirill1ru, конечно такой вариант нас не устроит.
Повторение неограниченное кол-во раз (*)
Так как мы ищем среди неопределённого количество поддоменов, нам необходимо поправить наше выражение .*\.vasilevkirill\.ru.
Первая точка обозначает что любой символ, а звездочка после, обозначает, то что стоит перед звёздочкой, повторяется несколько раз. Далее символ точки, так как он экранирован и дальше домен.
Конец строки ($)
Естественно результат нас точно не устроит так как теоретически может быть строка например такая ятакустал.vasilevkirill.ru.webarchive.org и выборка такого результата нас не устроит. Для того чтобы указать, что строка должна заканчиваться указывайте символ доллара ($) .*\.vasilevkirill\.ru$.
Начало строки (^)
А что делать если нам необходимо не поддоменов, а только домен, изменим наше выражение указав в самом начале символ карет (^) ^vasilevkirill\.ru$
- ^ — Начало строки
- vasilevkirill
- .- символ точки
- ru
- $ — конец строки
Наборы ([])
У нас есть документ со строками
ятакустал.vasilevkirill.ru
первыыйраз.ятакустал.vasilevkirill.ru
второйраз.ятакустал.vasilevkirill.ru
третийраз.ятакустал.vasilevkirill.ru
явсё.ятакустал.vasilevkirill.ru
янеустал.vasilevkirill.ru
imtired.vasilevkirill.ru
imnotired.vasilevkirill.ru
Нам необходимо выбрать только записи с поддоменов второго уровня, укажем выражение ^[a-z]*\.vasilevkirill\.ru$ то что указанно в группе (между квадратными скобками) обозначает любой символ из набора, есть специальные наборы например любая буква латиницей в нижнем регистре обозначает [a-z] если вам необходимо выбрать и заглавные тоже то можно указать так [a-zA-Z]. Если необходимо выбрать кириллицу, то укажите [a-zA-Za-яA-Я] и наше выражение принимает немного другой вид ^[a-zA-Za-яA-Я]*\.vasilevkirill\.ru$.
Что бы понять группы, приведу ещё пример, следующий текст все строки кроме последней попадут под выражение ^[porno]*\.vasilevkirill\.ru
ppppp.vasilevkirill.ru
ooooo.vasilevkirill.ru
rrrrr.vasilevkirill.ru
nnnnn.vasilevkirill.ru
porno.vasilevkirill.ru
ornop.vasilevkirill.ru
rnopo.vasilevkirill.ru
nopor.vasilevkirill.ru
noposr.vasilevkirill.ru
Так как только в последней строке встречается буква которая не перечислена в группе, она не пободает под выборку. Обратите внимания, что достаточно совпадение одного из.
Группы (())
Группы в отличие от наборов, указываются в круглых скобках, группы позволяют выполнять другие действия. Примеры будут дальше
Или (|)
У нас есть несколько доменов, и необходимо всех их найти, при этом отличие только доменом первого уровня.
vasilevkirill.ru
vasilevkirill.com
vasilevkirill.org
vas.ru
mail.ru
Наше выражение ^vasilevkirill\.(ru|com|org)$ мы собрали группу в круглые скобки и через оператор ИЛИ (вертикальная черта), нашли все наши домены которые заканчиваются на перечисленные домены первого уровня.
Повторение ({}+*)
Укажите в фигурных скобках, сколько раз должно повториться значение, при этом можно указать диапазон через запятую.
vpn-1.vasilevkirill.ru
vpn-2.vasilevkirill.ru
vpn-10.vasilevkirill.ru
vpn-20.vasilevkirill.ru
vpn-100.vasilevkirill.ru
vpn-200.vasilevkirill.ru
vpn-1000.vasilevkirill.ru
vpn-root.vasilevkirill.ru
vpn-notroot.vasilevkirill.ru
Имеет список доменов, нам надо выбрать домены которые будут оканчиваться на не более чем трёх значное число, т.е.выбрать все кроме трех последних.
Наше выражение vpn\-[0-9]{1,3}\.vasilevkirill\.ru$.
[0-9] — любое число {1,3} — должно повториться от одного до трёх раз
Если после запятой (например {4,}) не указывать до какого значения будут найдены все значения до бесконечности.
Знак + это синоним для {1,} — один и более повторений.
Группы (()) замена
Часто регулярные выражения применяют не для поиска, а для генерирования чего-либо или замены.
83?@gc46t5RXuj:user1
9g#2?U&%$4x!7P:user2
!8&5@f?Ke6#NpJ:user3
d#&9e!$36?@L%7:user4
49?2uVdi!k5&p8:user5
@%8#6V!2nmC1uS:user6
9s?W17@#huVm5$:use7
128sE3Wm57&?#B:user8
84k#vBTY&1G?u!:user9
&7!#68@1$w?V5%:user10
5%KFr3Hj618?d9:user11
27z4Y%t@3a#E6Q:user12
SQ12?aK3&RLz#U:user13
%?KV596w&c!#$1:user14
9v5%8E6mKL?#k4:user15
?7#5Y%uH1G8EQn:user16
!Y$472@UhA?81N:user17
ML75&8@q9T4R?#:user18
uL8#39g2!75b4@:good
n@&Wa#54%u7s6g:kirill
Предположим, что у нас есть файл с таким содержимым, и мы хотим создать в MikroTik записи в ppp secret, понятно что 20 записей можно и руками, но “я так устал” и предпочитаю руками делать по минимум, да и записей может быть тысячи и более. Да и не суть в целях, а суть в примере.
С начало определим, свойства нашего листа, пароль стоит первым, далее идёт разделитель в виде двоеточия и далее имя пользователя.
Подберём регулярное выражение — ^.*\:.*$ — тут всё просто
^— начало строки..*— любой символ повторяющийся неограниченное количество раз.\:— наш разделитель, на всякий случая экранируем его.(иногда может и не требоваться экранировать).*— любой символ повторяющийся неограниченное количество раз.$— конечно строки.
Теперь наши значения обернём в группы, просто в круглые скобки ^(.*)\:(.*)$, а теперь мы можем получить значения в этих группах $1 — первая группа, $2- вторая и т.д.
И предположим мы хотим сформировать строки следующего вида./ppp secret add name=username password=password тогда получается следующая картина.
^(.*)\:(.*)$ — строка для поиска /ppp secret add name=$2 password=$1 — строка для замены
пример в notepad++

Результат, а что с ним делать дальше вы наверное знаете.

Как проверить результат
- Проверьте выражение на совпадающей и несовпадающей строке.
- Добавьте граничные случаи: пустую строку, кириллицу и специальный символ.
- Уточните, требуется полное совпадение или поиск подстроки, и расставьте якоря.
Источники и связанные материалы
Команды в статье меняют сетевую конфигурацию. Перед работой сохраните экспорт, подготовьте способ восстановления доступа и применяйте изменения сначала в тестовой среде.