Регулярные выражения Определим следующие операции над множествами: Тогда регулярные выражения над алфавитом T и языки, представляемые ими, могут быть определены следующим образом: – Символ Λ, представляющий пустое множество, является регулярным выражением. – ε является регулярным выражением и представляет множество {ε}. – Для каждого символа a ∈ T a является регулярным выражением и представляет множество {a}. – Если p и q – регулярные выражения, представляющие множества P и Q, то (pq), (p+q) и (p*) являются регулярными Регулярные выражения как средство поиска текстовых фрагментов Представление буквенно-цифровых символов Большинство символов, таких как буквы или цифры, представляют сами себя. Представление пробельных символов Представление специальных символов Символ Представление Символ Представление * \* + \+ \ \\ [ \[ ] \] \f Символ конца страницы (FF) \n Символ перевода строки (LF) \r Символ возврата каретки (CR) \s Символ пробела. Эквивалентно [ \f\n\r\t\v] \S Непробельный символ. Эквивалентно [^ \f\n\r\t\v] \t Символ табуляции (HT) Представление символов по их коду Представление Кодирование \0n n — Восьмеричное число, не большее 377 \xn n — Шестнадцатеричное число из двух цифр, соответствует символу с данным кодом \un n — Шестнадцатеричное число из четырех цифр, соответствует символу Unicode Поиск повторяющихся последовательностей символов (квантификация) Позиция внутри строки Обозначение Число повторений * Ноль или более Представление Позиция + Одно или более ^ Начало строки ? Ноль или один раз $ Конец строки {n} \b Граница слова В точности n соответствий \B Не граница слова {n,} n или более соответствий {n, m} Минимум n и максимум m соответствий Наборы символов Метаси мвол Заменяет Значение \d [0-9] Цифра \D [^0-9] Не цифра \w [A-Za-zА-Яа-я0-9_] Символы образующие «слово» (буквы, цифры и символ подчёркивания) \W [^A-Za-zА-Яа-я0-9_] Символы не образующие «слово» Перечисление Вертикальная черта разделяет допустимые варианты. Например, «gray|grey» соответствует gray или grey. Группировка Круглые скобки используются для определения области действия и приоритета операций. Например, «gray|grey» и «gr(a|e)y» являются разными образцами, но они оба описывают множество, содержащее gray и grey. «Жадные» и «ленивые» выражения • *? — «не жадный» («ленивый») эквивалент * • +? — «не жадный» («ленивый») эквивалент + • {n,}? — «не жадный» («ленивый») эквивалент {n,} Варианты регулярных выражений • Традиционные регулярные выражения в Unix Синтаксис «базовых» регулярных выражений (BRE) на данный момент определён POSIX как устаревший, но он до сих пор широко распространён из соображений обратной совместимости. Многие Unix-утилиты используют такие регулярные выражения по умолчанию. • Расширенные регулярные выражения в стандарте POSIX Синтаксис расширенных (extended) регулярных выражений POSIX (ERE) в основном аналогичен традиционному. Было отменено использование обратной косой черты для метасимволов: {…} вместо \{…\} и (…) вместо \(…\). Обратная косая черта перед метасимволом в расширенных выражениях отменяет его специальное значение • Perl-совместимые регулярные выражения (PCRE) Регулярные выражения в Perl имеют более богатый и в то же время предсказуемый синтаксис, чем даже в POSIX. По этой причине очень многие приложения используют именно Perl-совместимый синтаксис регулярных выражений. Классы символов Posix POSIX класс PCRE Значение Описание [:upper:] [A-Z] символы верхнего регистра [:lower:] [a-z] символы нижнего регистра [:alpha:] [A-Za-z] [:alnum:] \w [A-Za-z0-9] [:digit:] \d [0-9] [:xdigit:] [0-9A-Fa-f] [:punct:] [.,!?:…] [:blank:] [ \t] [:space:] \s [ \t\n\r\f\v] [:cntrl:] [:graph:] [:print:] символы верхнего и нижнего регистра цифры, символы регистра верхнего и цифры шестнадцатеричные цифры знаки пунктуации пробел и TAB символы пропуска символы управления \S [^ \t\n\r\f\v] символы печати [^\t\n\r\f\v] символы печати и символы пропуска нижнего Синтаксис выражений замены PCRE Символ Значение $цифра Заменяет на группу с заданным номером (нумерация с 1). Группа 0 соответствует всей найденной подстроке ${группа} Заменяет на группу с заданным именем, т.е. ранее помеченную как (?<группа>e) $$ Заменяет на символ $ $& Заменяет на всю найденную подстроку (совпадает с $0) $` Заменяет на текст перед найденной подстрокой $' Заменяет на текст после найденной подстроки $+ Заменяет на последнюю найденную строку $_ Заменяет на всю входную строку Примеры регулярных выражений • HTML tag (Matches any opening or closing HTML tag, without its contents.) </?[a-z][a-z0-9]*[^<>]*> • URL: Find in full text (The final character class makes sure that if an URL is part of some text, punctuation such as a comma or full stop after the URL is not interpreted as part of the URL.) \b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|] • Security: ASCII code characters incl. tab and CRLF (Matches any single non-printable code character that may cause trouble in certain situations. Includes tabs and line breaks.) [\x00-\x1F] • Programming: String (Quotes may not appear in the string. The string cannot span multiple lines.) "[^"\r\n]*"