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

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

Квантификаторы (quantifiers) (они же повторители, или умножители) – конструкции, которые указывают, сколько раз можно повторить предыдущее выражение (символ, символьный класс, альтернативу или группу). Ограничиваются парой фигурных скобок { }.

Виды квантификаторов ­перечислены в таблице 3 (здесь n,m обозначают целые числа 0,1,2…). Кстати, метасимволы * + ? из таблицы 1 тоже являются квантификаторами.

Таблица 3

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

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

Описание

Пример

{n}

Точный – выражение должно повторяться ровно n раз.

\d{3}’ трехзначное число

{n,m}

Пробелы в скобках не допускаются!

Конечный – выражение может повторяться от n до m раз.

\d{2,3}

двух или трех-значное число

{n,}

Бесконечный – выражение может повторяться от n до бесконечности

ab{2,}’ находит

“abb”, “abbb”, “abbbb” и т.д.

3.3.4. О квантификаторах: жадных и ленивых

Квантификатор называется «жадным» (greedy), если из всех возможных подстрок, соответствующих шаблону поиска, он выбирает максимально длинную. Ленивым (lazy), или «не жадным», называют квантификатор, который прекращает поиски, как только найдет первую подходящую подстроку минимальной длины. Квантификаторы из таблицы 3 и метасимволы * + ? являются жадными.

Можно избавить квантификатор от жадности, превратив его в ленивый: добавить после него знак вопроса '?' (см. таблицу 4).

Таблица 4

«Жадные» и «ленивые» варианты квантификаторов

Жадный

Описание

Ленивый

Описание

*

повторение 0 и более раз.

То же, что и {0,}

*?

повторение 0 и более раз.

То же, что и {0,}?

+

повторение 1 и более раз.

То же, что и {1,}

+?

повторение 1 и более раз.

То же, что и {1,}?

?

повторение 0 или 1 раз.

То же, что и {0,1}

??

повторение 0 или 1 раз.

То же, что и {0,1}?

{n}

повторение точно n раз

{n}?

повторение точно n раз

{n,m}

повторение не менее n и не более m раз

{n,m}?

повторение не менее n и не более m раз

{n,}

повторение не менее n раз

{n,}?

повторение не менее n раз

Пример:

При поиске в строке "hello! how are you?" по шаблону ‘h.*o’ (найти строку начинающуюся с буквы “h, за которой следует несколько произвольных символов, за которыми следует “o”), будет найдена строка максимальной длины, а именно: «hello! how are you?» из-за жадности квантификатора ‘*’, ищущего не первую, а последнюю "о". Если изменить шаблон на не жадный ‘h.*?o’, будет найдено “hello! how are you? ”. ■

3.3.5. Группировки, они же подвыражения, они же подмаски

Когда часть регулярного выражения записывается в круглых скобках (…), она называется группировкой или подвыражением. Смысл группировок в том, чтобы обозначать неделимые части конструкций.

Группировки применяются:

  1. для задания альтернатив (см. последний пример на стр. 8)

  2. совместно с квантификаторами для выделения подстрок, которые нужно повторить заданное число раз.

Примеры:

  • Шаблон ‘(123)+’ найдет строки “123”,“123123”, “123123123” и т.д.

  • Шаблон ‘(Кара){1,2}кум’ выловит “Каракум”, “КараКаракум”.

  • Более сложный пример: выделение доменного имени Интернет-сайта. Доменное имя состоит из имён доменов первого, второго и т.д. уровней, разделенных точками. Каждое имя может содержать латинские буквы, цифры, тире и знак подчеркивания. Шаблон ‘[_A-Za-z\d\–]+(\.[_A-Za-z\d\–]+)+’ состоит из двух частей: первая часть описывает имя первого из доменов, вторая часть – остальные имена через точку (группировка с повторителем «+») ■

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

Примеры:

  • Допустим, из текста нужно выделить даты, записанные в формате dd/mm/yyyy. Шаблон для поиска ‘\d{2}/\d{2}/\d{4}’ найдет в тексте “Срок действия вашего договора с 15/02/2011 по 27/06/2011” две подстроки (подчеркнуты). Если для последующей обработки из найденных подстрок необходимо выделить день, месяц, год по отдельности (например, чтобы сохранить в базу данных), удобно использовать группировки. Перепишем шаблон поиска: ‘(\d{2})/(\d{2})/(\d{4})’, заключив день, месяц, год в скобки – получилось три группы. Функции языков программирования, выполняющие поиск по регулярным выражениям, как правило возвращают найденные строки в массиве. Назовем его Match[]. Элемент Match[0] будет содержать всю найденную подстроку, элемент Match[1] – значение первой группы, Match[2] – значение второй группы и т.д. После первого поиска Match[0]=”15/02/2011”, Match[1]=”15”, Match[2]=”02”, Match[3]=”2011”, после второго поиска Match[0]=”27/06/2011”, Match[1]=”27”, Match[2]=”06”, Match[3]=”2011”. Так с помощью групп можно выделить из найденной строки нужные части.

  • Другой пример: в строке записано вещественное десятичное число со знаком. Нужно выделить знак, целую и дробную части. Шаблон такой: ‘(\+|–)(\d+)\.(\d+)’. Здесь три группы: знак, целая часть, дробная часть.■

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