
- •Министерство образования и науки российской федерации
- •Обработка текстов с использованием регулярных выражений
- •305040, Г.Курск, ул. 50 лет Октября, 94. Содержание
- •Введение
- •1. Цель работы
- •2. Необходимое программное обеспечение
- •3. Теоретическая часть
- •3.1. Зачем нужны регулярные выражения
- •3.2. Регулярные выражения: что это такое?
- •3.3. Синтаксис регулярных выражений
- •3.3.1. Метасимволы
- •Значения метасимволов
- •Последовательности метасимволов
- •3.3.2. Символьные классы
- •3.3.3. Квантификаторы
- •Квантификаторы
- •3.3.4. О квантификаторах: жадных и ленивых
- •«Жадные» и «ленивые» варианты квантификаторов
- •3.3.6. Обратные ссылки
- •3.3.7. Модификаторы
- •Модификаторы
- •3.4. Как оно всё работает
- •3.5. Чего не умеют регулярные выражения
- •4. Использование библиотеки RegExpr
- •4.1. Как делается поиск подстрок
- •4.2. Как делается поиск и замена
- •5. Порядок выполнения работы
- •6. Содержание отчета
- •7. Контрольные вопросы
- •Библиографический список
- •Варианты заданий
Модификаторы
Модификатор |
Описание |
(?i) |
включен регистро-независимый режим (большие и маленькие буквы не различаются)2 |
(?-i) |
отключен регистро-независимый режим |
(?r) |
модификатор включает в диапазон а-я букву 'ё' (и в А-Я –букву 'Ё'), а а-Я включает вообще все русские буквы |
(?-r) |
режим поддержки буквы «Ё» отключен |
(?m) |
входной текст воспринимается как многострочный. Метасимволы ‘^' и ‘$’' будут совпадать не только в начале и конце текста в целом, но и в начале и в конце каждой строки |
(?-m) |
многострочный режим отключен |
(?s) |
входной текст воспринимается как одна строка. Символы перехода строк считаются за пробельные. |
(?-s) |
однострочный режим отключен. Метасимвол ‘.’ (точка) не совпадает с разделителями строк |
(?g) |
принудительный перевод квантификаторов в "не жадный" режим (то есть '+' работает как '+?', '*' как '*?' и т.д.) |
(?-g) |
все квантификаторы работают как обычно |
(?x) |
позволяет записывать регулярное выражение на нескольких строках (в целях улучшения читаемости) – подробности см. в HLP-файле |
(?#комментарий) |
так записываются комментарии внутри регэкспа |
Примеры:
Шаблон ‘a(?i)bc’ найдет строки, начинающиеся с «а» маленького, а буквы «bc» уже регистро-независимые: будет найдено «abc», «aBC», «aBc», «abC».
В шаблоне ‘a((?i)bc)d’ действие модификатора ограничено пределами группы, поэтому буквы «a» и «d» должны быть маленькие, т.к. они не входят в область действия модификатора, а строка «bc» не чувствительна к регистру.
Шаблон ‘(?i)float’ отыщет “float”, “Float”, “FLOAT” и др., поэтому модификатор (?i) удобен для анализа текстов программ. ■
3.4. Как оно всё работает
Этот параграф – для любознательных. Здесь вкратце описано, как работают регулярные выражения «изнутри». Кому не интересно – можете пропустить.
Работа регулярных выражений основана на обработке текста конечными автоматами (вспомните лабораторную работу по «Теории автоматов» [2]). «Движок» регэкспов, получая регулярное выражение, создаёт в оперативной памяти таблицу переходов конечного автомата. Под действием очередного символа текста автомат переходит из одного состояния в другое, пока не дойдет до «конечного» состояния – считается, что подстрока найдена. При этом запоминается позиция в тексте, где окончился последний поиск. Следующий поиск продолжится с этого места.
Существует несколько типов конечных автоматов (машин регулярных выражений), различающихся сложностью работы, и, как следствие, сложностью обрабатываемых регулярных выражений. В каждом языке программирования (или библиотеке регэкспов) используется один из них:
1. DFA (Deterministic Finite-state Automaton – детерминированный конечный автомат). Он работает линейно по времени, поскольку не нуждается в откатах (и никогда не проверяет один символ дважды). Он может гарантированно найти самую длинную строку из возможных. Однако он не умеет ловить подвыражений (группировок), и не работает с обратными ссылками. DFA используются в awk, egrep, flex, lex.
2. Традиционные NFA-машины (NonDeterministic Finite-state Automaton – недетерминированные конечные автоматы) используют "жадный" алгоритм отката, проверяя все возможные расширения регулярного выражения в определенном порядке и выбирая первое подходящее значение. Традиционный NFA умеет искать подвыражения и обратные ссылки. Но из-за откатов традиционный NFA может проверять одно и то же место несколько раз. В результате работает он медленнее. Поскольку традиционный NFA принимает первое найденное соответствие, он может не найти самое длинное из вхождений. Традиционные NFA машины используются в Perl, Python, Java, Ruby, .Net GNU Emacs, PHP, библиотеках PCRE.
3. POSIX NFA - машины похожи на традиционные NFA-машины, за исключением "терпеливости" – они продолжают поиск, пока не найдут самое длинное соответствие. Поэтому POSIX NFA медленнее традиционных, и поэтому же POSIX NFA нельзя заставить выбрать короткое соответствие, если есть длинное. Одно из главных достоинств POSIX NFA – наличие стандартной реализации. Используется в mawk.