Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы СПО / РегЭкспы методичка.docx
Скачиваний:
60
Добавлен:
12.04.2015
Размер:
254.09 Кб
Скачать

Модификаторы

Модификатор

Описание

(?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.

Соседние файлы в папке Лабы СПО