Простые регулярные выражения

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

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

Сразу в бой

Не сильно углубляясь, только поверхностно.

Любой символ (.)

Предположим что у нас есть строка ятакустал.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
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++

Васильев Кирилл vasilev kirill regexp simple

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

Васильев Кирилл vasilev kirill regexp simple

Поделиться

Обсуждение