Простые регулярные выражения
Регулярные выражения это часть нашей с вами жизни и некуда вам от них не деться. Я постараюсь на простых примерах показать что не так страшен чёрт.
Я не буду размусоливать и рассказывать где используются регулярные выражения, если вы читаете этот текст, то точно знаете что они вам нужны.
Сразу в бой
Не сильно углубляясь, только поверхностно.
Любой символ (.)
Предположим что у нас есть строка ятакустал.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++

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

Поделиться
Обсуждение
Лицензия
Текст данной статьи распространяется под общедоступной лицензией CC BY-NC-ND 4.0, ознакомиться с тектом лицензии вы можете на данной странице.