DeePark.ru

Недавние комментарии
Автор: Kolelan | Опубликовано: 28.03.2017

Оглавление

Вступление

Статья написана под впечатлением от прочтения книги Джеффри Фридла «Mastering Regular Expressions» http://regex.info Книга хорошая, рекомендую.

Регулярные выражения – мощное, гибкое и эффективное средство обработки текстов. Универсальные шаблоны регулярных выражений сами по себе напоминают миниатюрный язык программирования, предназначенный для описания и разбора текста.

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

Чтобы начать использовать регулярные выражения (далее regex или реджекс) нужно знать метасимволы. Метасимволы контекстно зависимы. В символьном классе и в самом выражении имеют разное значение.

Как и в книге примеры можно опробовать утилитой grep, для этого нужно:
grep -E `Regex` File-to-test

И конечно следует помнить о диалектах.

Начало и конец строки

Метасимволы начала и конца строки определяют положение искомого текста в строке а не совпадение с символом.

^ - (крышка или циркумфлекс) начало строки

$ - конец строки

С этим уже можно что-то выбрать.

^text-to-find$ - выбрать строки которые начинаются текстом text-to-find а за тем сразу конец строки.

^$ - выбрать строки в которых после начала строки сразу конец строки.

^ - выбрать все строки в которых есть начало строки (ну все короче)

Символьные классы

Конструкция […] это один символ целевого текста.

gr[ae]y — выберет все слова gray и grey.

sep[ae]r[ae]te — выберет все слова separate, seperate, separete, seperete.

Дефис в контексте символьного класса заменяет перечисление символов по порядку (интервал). Интервалы можно объединять с литералами.

[0-9a-fA-F] — один любой шестнадцатеричный символ.

<Н[1-3]> - совпадает с последовательностями <H1>, <H2>, <H3>

Инвертирование символьного класса производится конструкцией [^…] что означает, здесь один символ который не совпадает с перечисленным набором или интервалом.

. - (точка) это сокращённая форма символьного класса совпадающая с любым символом.

Одно из нескольких подвыражений

Очень удобный метасимвол | (вертикальная черта) означает «или». Он позволяет объединить несколько регулярных выражений в одно, совпадающее с любым из выражений компонентов. Например, From и Send – два разных выражения, a (From|Send) – одно выражение, совпадающее с любой из этих строк.

Игнорирование различий в регистре

Для утилиты grep производится путём установки параметра (ключа) -i
grep -i -E `Regex` file

для PHP функций типа preg_… игнорирование различий производится модификатором i

preg_match('@Regex@i', $string, $matches)

Границы слов

\< - начало слова.

\> - конец слова

Необязательные элементы

Метасимвол ? (знак вопроса) означает, что предшествующий ему символ является необязательным. Так же знак вопроса называют квантификатором который говорит что символ перед ним встречается 0 или 1 раз.

Квантификаторы

? — элемент встречается ноль или один раз.

+ — элемент встречается один или несколько раз.

* — элемент встречается ноль или несколько раз (любое количество раз).

{min, max} — элемент встречается от min до max количество раз (это интервальный квантификатор)

Круглые скобки

Круглые скобки используются в следующих случаях

  • Ограничение области действия в конструкции выбора
  • Группировка символов для применения квантификаторов
  • Обратные ссылки

Обратные ссылки

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

\<([A-Za-z]+) +\1\> - шаблон для поиска двух повторяющихся в тексте слов.

Пары скобок нумеруются в соответствии с порядковым номером открывающей скобки слева направо, поэтому в выражении ([a-z])([0-9])\1\2 метасимвол \1 ссылается на текст, совпавший с [a-z], a \2 ссылается на текст, совпавший с [0-9].

Экранирование

Экранирующий префикс \ может экранировать любые метасимволы (считать их литералами) кроме экранирования метасимволов символьных классов.

Пример
\([a-zA-Z! ]+\) — поиск слов в круглых скобках например (Hello world!)

Примеры регулярных выражений

[a-zA-Z][a-zA-Z_0-9]* — имена переменных (иногда имена переменных должны начинаться с буквы и содержать буквы и цифры).

[a-zA-Z][a-zA-Z_0-9]{0,31} — т.ж. но ограничение на 32 символа.

“[^“]*“ - последовательность символов в кавычках ([^“] -любой символ кроме “).

[0-9]+ *(рублей\.?|руб\.?|р\.?) *([0-9][0-9] *(коп\.?|к\.?|копеек\.?))? - денежные суммы в руб. с необязательным указанием копеек.

Примечания

При построении регулярного выражения необходимо постоянно следить за тем, чтобы регулярное выражение:

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

Материалы

Книга Джеффри Фридла «Mastering Regular Expressions» http://regex.info

Оставить комментарий

Оставить комментарий могут только зарегистрированные пользователи