Техническая документация/Регулярные выражения.md


Регулярные выражения


Самое главное

Эта шпаргалка написана для себя! Претензии о правильности или неправильности написанного, его составе, объеме, ваших пробелах в зании русского и иных языков, как и ошибках, опечатках, сленге, ненормативной лексике - не принимаются.

Далее — все по мере значимости.

И да - эта шпаргалка написана на основе изучения книги Дж.Фридла «Регулярные выражения». Согласно учению Фридла, регулярные выражения записываются в специальных скобках ⎡…⎦, например ⎡[a-zA-Z]{1,5}⎦. Как они называются - мне безразлично, но в тексте этого конспекта они будут фигурировать.

Второе самое главное

Все это имеет смысл в первую очередь для грепания (grep) данных. Потом для текстовых редакторов, а потом для программирования.

  1. при запуске grep (egrep) паттерн записывается с ключем -P, а поиск без учета заглавных букв -i (см. man)
  2. в текстовых редакторах нужно ставить галку «регулярное выражение» в окне поиска
  3. при программировани стандарт, который тут рассматривается называется перловским (а их, стандартов, много) - он используется практически везде, но в первую очередь в bash, js, python (для меня актуальны они).

и да — я разбирался только в вопросах поиска совпадений регулярными выражениями. Всего остального (замены например) в этом конспекте нет (читай книгу).

Третье самое главное

Любое регулярное выражение - это, в любом случае, некоторая сетепень абстракции, с которой мирится разработчик (ну или пользователь) и они могут выдавать достаточно неожиданные результаты. Если выражение сложное - то его имеет смысл протестировать тестером регулярок на той текстовой модели, где оно будет применяться. В сети их (тестеров) до(.)+(я|а|ы|и) , если не больше…

Смысл регулярного выражения

В самом общем смысле регулярное выражение либо совпадает внутри некоторого фрагмента текста (при использовании egrep – в строке), либо не совпадает. При построении регулярного выражения приходится постоянно следить за тем, чтобы регулярное выражение:

• совпадало там, где нужно;
• не совпадало там, где не нужно.

Метасимволы

^ — начало строки, как позиция ( ^ре )

$ — корнец строки, как позиция ( ..икс$)

[…] — символьный класс ( [0-9A-Z_!.?] , [1-9], [а-я])

[^…] — инвертированный класс ([^0-9] - это все кроме числовых символов)

инвертированный символьный класс означает «совпадение с символами, не входящими в список», а не «несовпадение с символами, входящими в список». состав и интерпретация метасимволов различаются внутри класса и за его пределами Символьные классы, можно считать, обладают собственным мини-языком (и, в частности, собственными представлениями о метасимволах)

. — любой символ (теряет силу внутри класса)

| — выбор, оператор «или» ( мама|маша )

не путайте конструкцию выбора с символьными классами. Символьный класс представляет один символ целевого текста. В конструкциях выбора каждая альтернатива может являться полноценным регулярным выражением, совпадающим с произвольным количеством символов

(…)— скобки - они и в ЕАО скобки - указывают на изоляцию одного выражения от другого.

пример:

^ре|для|эт - найдет все строки начинающиеся с «ре» и части строк «для» и «эт»

^(ре|для|эт) - только указанные значения, стоящие в начале строки

< — начало слова (как позиция)

> — конец слова (как позиция)

Эти два метасимвола работают аналонично ^ и $ (<…ов найдет подстроки «недов…» и «в повс…» пробел тут указан как любой символ, а <…> - все слова из трех букв). Эти якоря не работают со спецсимволами

Квантификаторы (вычисляемые выражения, походу так можно назвать)

? — действует только на предыдущий символ (выражение). одначает проверку на его наличие. Эквивалентно ⎡{0,1}⎦

пример:

пе?ред.? - найдет совпадения: перед, пред, предв, преда, и очень многие

другие, причем в составе слов. Но его удобно использовать с выражениями — 4t( ?st)? - найдет «4t», «4t st», и «4tst»

  • — повторение 1 раз (минимум 1 раз)

  • — повторение много раз

⎡ + ⎦ (плюс) и ⎡ * ⎦ (звез(дочка). Метасимвол ⎡ + ⎦ обозначает «один или несколько экземпляров непосредственно предшествующего элемента», a ⎡ * ⎦ – «любое количество экземпляров элемента (в том числе и нулевое)». Иначе говоря, ⎡ …* ⎦ означает «найти столько экземпляров, сколько это возможно, но при необходимости обойтись и без них».

пример:

За+хер найдет захер, заахер, зааааахер…, как и За*хер (а это между прочим торт…)

{min,max} - интервал.

пример:

⎡[a-zA-Z]{1,5}⎦ — любой английский символ от 1 до 5 раз

для () есть еще обратные сслыки (\1,\2,… Обратная ссылка * Текст, ранее совпавший с первой, второй и т. д. парами круглых скобок) - они нужны дял поиска дублей. по мне так неособо… поэтму я их суда не пишу, но упоминаяю о них. гугли. обратные сылки поддерживают далеко не все программы.

\ — а это экранирвоание: оно действует на следующий символ! (нужно когда метасимвол нужно применить как неметасимвол, например $)

Наиболее значимые примеры

“[^"]*” - текст в кавычках

<http //[-a-z0-9_.:]+/[-a-z0-9_:@&?=+,.!/~*%$]*.html?> — адрес в инернете

Ссылка на вики репозиторий
Назад
Ссылка на вики репозиторий