Регулярные выражения 1. 2. 3. Теория Синтаксис регулярных выражений Примеры реализации на Java + Python Степулёнок Денис Олегович Регулярное выражение Regular Expressions - формальный язык поиска (и замены) подстрок в тексте, основанный на использовании метасимволов (wildcard characters). RegExp - строка-образец (pattern, «шаблон», «маска»), состоящая из символов и метасимволов и задающая правило поиска. Зачем? Регулярные выражения нужны для обработки текста и позволяют: Эффективный по времени и памяти поиск в тексте по заданному шаблону Замену и удаление подстрок по шаблону (в редакторе, например) Разделить текст на части Выбрать из текста необходимые фрагменты Применение • Разбор логов/вебстраниц/конфигов • Преобразование форматов текста • Анализ входных данных Конечный автомат Конечный автомат — абстрактный автомат, число возможных состояний которого конечно. Результат работы автомата определяется по его конечному состоянию. Диаграмма состояний Граф переходов Синтаксис RegExp (язык) PCRE (Perl Compatible Regular Expressions) регулярные выражения совместимые с Perl Обычный символ – представляет в выражении сам себя (можно искать строки «как обычно») Метасимволы: ◦ Классы символов ◦ Квантификаторы JavaFX Java: пакет java.util.regex Класс Pattern: скомпилированное регулярное выражение Класс Matcher: поиска и замена текста по регулярному выражению Класс PatternSyntaxException - ошибка Реализация в Intellij Idea ->… Шаблон телефона Квантификатор \d+-\d+-\d+ Любая цифра 231-32-33 345-34-54 233-12-34 Метасимволы \ – экранирование символов . (точка) – любой символ [...] – набор символов (любой символ из набора) [^aodsfi] – отрицание наборов символов () – группа (может быть несколько) \n – обратная ссылка на группу, например: \1, \2. Классы символов \d - [0-9] - Цифровой символ \D - [^0-9] - Нецифровой символ \s - [ \f\n\r\t\v] - Пробельный символ \S - [^ \f\n\r\t\v] - Непробельный символ \w - Буквенный или цифровой символ или знак подчёркивания \W - Любой символ, кроме буквенного или цифрового символа или знака подчёркивания Квантификация (поиск последовательностей) Квантификатор после символа, символьного класса или группы определяет, сколько раз предшествующее выражение может встречаться. Следует учитывать, что квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа. Представление Число повторений Пример Соответствие {n} Ровно n раз colou{3}r colouuur {m,n} От m до n вкл ючительно colou{2,4}r colouur, colouuu r, colouuuur {m,} Не менее m colou{2,}r colouur, colouuu r, colouuuur и т. д. {,n} Не более n colou{,3}r color, colour, col ouur, colouuur Если символы { } не образуют квантификатор, их специальное значение игнорируется. Квантификация: ? * + Представлен ие Число повторений ? Ноль или одно {0,1} colou?r color, colour * Ноль или более {0,} colou*r color, colour, c olouur и т. д. + Одно или более {1,} colou+r colour, colouu r и т. д. (но не color) Эквивалент Пример Соответстви е Часто используется последовательность .* для обозначения любого количества любых символов между двумя частями регулярного выражения. Позиция внутри строки Представление ^ $ \b \B \G Позиция Пример Соответствие Начало строки ^a (или текста при модификаторе ?m) aaa aaa Конец строки (или a$ текста при модификаторе ?m) aaa aaa a\b aaa aaa \ba aaa aaa Не граница слова \Ba\B aaa aaa Предыдущий успешный поиск \Ga aaa aaa (поиск остановился на 4-й позиции — там, где не нашлось a) Граница слова Якоря - позиция внутри строки ^ – начало строки Конец строки – $ Точное совпадение – ^слово$ Группы Группировка – (текст) Незахватывающие группы – (?:выражение) Python 3 Используем библиотеку регулярных выражений re: import re Поиск телефонов в тексте Поиск всех вхождений >> список Проверка e-mail ^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z09_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$ Стандарт (RFC): http://www.ietf.org/rfc/rfc0822.txt?n umber=822 Полная проверка по RFC: http://www.ex-parrot.com/pdw/MailRFC822-Address.html Использование в редакторе Ctrl-R в Intellij Idea / PyCharm / других редакторах С++ / Qt http://qt-project.org/doc/qt-5/QRegExp.html Класс QRegExp Qt QRegExp использование Online проверка регулярных выражений http://www.pcre.ru/eval/ Ссылки http://www.pcre.ru/ - сайт о PCRE регулярных выражениях http://ru.wikipedia.org/wiki/Регулярн ые_выражения - Википедия http://ru.wikibooks.org/wiki Регулярные_выражения Викиучебник