Метка: regexp

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

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

    Диалекты регулярных выражений отличаются. Примеры статьи близки к 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++

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

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

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

    Как проверить результат

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

    Источники и связанные материалы

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