Техническая документация/Регулярные выражения.md
Регулярные выражения
Самое главное
Эта шпаргалка написана для себя! Претензии о правильности или неправильности написанного, его составе, объеме, ваших пробелах в зании русского и иных языков, как и ошибках, опечатках, сленге, ненормативной лексике - не принимаются.
Далее — все по мере значимости.
И да - эта шпаргалка написана на основе изучения книги Дж.Фридла «Регулярные выражения». Согласно учению Фридла, регулярные выражения записываются в специальных скобках ⎡…⎦, например ⎡[a-zA-Z]{1,5}⎦. Как они называются - мне безразлично, но в тексте этого конспекта они будут фигурировать.
Второе самое главное
Все это имеет смысл в первую очередь для грепания (grep) данных. Потом для текстовых редакторов, а потом для программирования.
- при запуске grep (egrep) паттерн записывается с ключем -P, а поиск без учета заглавных букв -i (см. man)
- в текстовых редакторах нужно ставить галку «регулярное выражение» в окне поиска
- при программировани стандарт, который тут рассматривается называется перловским (а их, стандартов, много) - он используется практически везде, но в первую очередь в 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?> — адрес в инернете