Изучаем регулярные выражения [Бен Форта] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

ИЗУЧАЕМ

РЕГУЛЯРНЬIЕ
ВЬIРАЖЕНИЯ

ИЗУЧАЕМ

РЕГУЛЯРНЫЕ
ВЫРАЖЕНИЯ

LEARNING

REGULAR
EXPRESSIONS
BEN FORTA

"'•"' Addison-Wesley
Boston • Columbus • lndianapolis • New York • San Francisco • Amsterdam
Саре Town • Dubai • London • Madrid • Milan • Munich • Paris
Montreal • Toronto • Delhi • Mexico City • Sao Paulo • Sidney
Hong Kong • Seoul • Singapore • Taipei • Tokyo

ИЗУЧАЕМ

РЕГУЛЯРНЬIЕ
ВЬIРАЖЕНИЯ
БЕН ФОРТА

Москва · Санкт-Петербург

2019

ББК

32.973.26-018.2.75
Ф80

УДК 681.3.о?
ООО "Диалектика"
Перевод с английского и редакция И.В. Берштейна

По общим вопросам обращайтесь в издательство "Диалектика" по адресу:

info@dialektika.com, http://www.dialektika.com
Форта, Бен.
выражения.

Изучаем регулярные

Ф80

ООО "Диалектика",

ISBN

2019. - 192 с.:

ил.

-

:

Пер.

с

-

СПб.

978-5-б041394-2-4 (рус.)
ББК

Вес

англ.

Парал. тит. англ.

названия

программных

11родуктов

яв11яются

32.973.26-018.2.75

зарегистрированными торговыми

марками

соответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть вослроизвецеt1а в какой
бы то ни было форме и какими бы то 11и было средствами, будь то электронные или механические,
включая фотокопирование и запись на мап1итный носитель, если на это нет письменного разрешения

издательства

Addison-Wesley Publishing Company, Inc.

Authorized Russian translation of thc English edition of Learnirig Regulлr Expressiom (ISBN 978-0-13475706-3) © 2018 Pearson Education, lnc.
'Ihis translation is puЫished and sold Ьу permission of Pearson Education, lnc., which оwщ; or controls all
rights to sell the same.
AlJ rights reserved. No part of this book may Ье reproduced or transшitted in any form or Ьу any means,
electronic or mcchanical. including photocopyiпg, recording, or Ьу any information storage or retrieval system,
without the prior written permission of tht.:" copyright owncr and the PuЬlisher.

Научно-популярное издание

Бен Форта

Изучаем регулярные выражения

17.10.2018. Формат 84х108/32.
Minion Pro.
Усл. печ. л. 6,0. Уч.-изд. л. 5,5.
Тираж 500 экз. Заказ № 9994.

Подписано в печать

Гарнитура

Отпечатано в АО "Первая Образцовая типография"
Филиал "Чеховский Печатный Двор"

142300, Московская область, г. Чехов, ул. Полиграфистов, д. 1
Сайт: www.chpd.ru, E-mail: sales@chpd.ru, тел. 8 (499) 270-73-59
ООО "Диалектика':

195027, Санкт-Петербург,
30, лит. А, пом. 848

Магнитогорская ул., д.

ISBN 978-5-6041394-2-4
ISBN 978-0-13-475706-3

(рус.)
(англ.)

© ООО "Диалектика", 2019
© Pearson Education, !пс., 2018

Оглавление

Введение

9

Урок 1. Введение в реrуnярные выражения

13

Урок 2. Обнаружение совпадения с отдельными симвоnами

21

Урок 3. Совпадение с набором символов

33

Урок 4. Применение метасимвоnов

45

Урок 5. Повторение совпадений

61

Урок 6. Совпадение позиций

83

Урок 7. Применение подвыражений

95

Урок 8. Применение обратных ссыпок

107

Урок 9. Просмотр вперед и назад

123

Урок

10. Встраивание усnовий

137

Урок

11. Решение типичных задач с помощью реrуnярных
выражений

147

Приnожение. Реrуnярные выражения в распространенных
приnожениях и языках

Предметный указатеnь

171
187

Содержание
Введение
Кому адресована эта книга
От издательства

Урок

1. Введение в реrуnярные выражения
Потребность в регулярных выражениях
О применении регулярных выражений
Операции поиска с помощью регулярных выражений

Операции замены с помощью регулярных выражений
Так что же такое регулярное выражение?
Применение регулярных выражений
Предварительные замечания
Резюме

Урок 2. Обнаружение совпадения с отдеnьными симвоnами
Совпадение с обычным текстом
Количество совпадений

Учет регистра букв
Совпадение с любыми символами
Совпадение со специальными символами
Резюме

Урок 3. Совпадение с набором симвоnов

9
10
11
13
13
15
15
16
17
18
19
20
21
21
23
23
24
28
31

Совпадение с любыми символами, кроме указанных

33
33
37
42

~~

~

Совпадение с одним из нескольких символов

Применение диапазонов в наборах символов

Урок 4. Применение метасимвоnов
Еще раз об экранировании
Совпадение с пробельными символами
Совпадение с отдельными типами символов

Совпадение с цифровыми и не цифровыми символами

45
45
49
51
52

Совпадение с буквенно-цифровыми
и не буквенно-цифровыми символами

54

Содержание

7

Совпадение с пробельными и не пробельными символами

55

Обозначение шестнадцатеричных и восьмеричных значений

56
57

Применение классов символов

POSIX

~~
Урок S. Повторение совпадений
Количество совпадений
Совпадение с одним или несколькими символами

Совпадение с нулевым или большим количеством символов
Совпадение с нулевым или единичным количеством символов
Применение интервалов

Совпадение с конкретным интервалом символов
Совпадение с интервалом символов в заданных пределах

Совпадение хотя бы с заданным интервалом символов
Предотвращение лишних совпадений
Резюме

Урок 6. Совпадение позиций
Назначение границ
Определение границ слова
Определение границ символьных строк

Применение многострочного режима
~~~
Урок 7. Применение подвыражений

Общее представление о подвыражениях
Группирование подвыражений
Вложение подвыражений
Резюме

Урок 8. Применение обратных ссыпок
Общее представление об обратных ссылках
Совпадение с обратными ссылками
Выполнение операций замены

Смена регистра букв
Резюме

Урок 9. Просмотр вперед и назад
Общее представление о позиционном просмотре
Просмотр вперед
Просмотр назад

Сочетание просмотра вперед и назад

я

61
61
62
67
69
72
73
75
77
78
81
83
83
84
88
92
м

95
95
96
102
106
107
107
111
116
120
122
123
123
125
127
131

8

Содержание

Отрицание позиционного просмотра
Резюме
Урок 10. Встраивание усповий
Причины для встраивания условий

Применение условий
Условия в обратных ссылках
Условия при позиционном просмотре
Резюме

132
134
137
137
139
139

143
145

Урок 11. Решение типичных задач с помощью

реrупярных выражений
Номера телефонов в Северной Америке

147

Комментарии к НТМL-разметке

148
150
151
152
154
155
156
158
159
160

Комментарии к сценариям

162

Почтовые индексы США
Канадские почтовые индексы
Почтовые коды Великобритании

Номера карточек социального страхования в США
IР-адреса

URL
Полные

URL

Адреса электронной почты

JavaScript

Номера кредитных карточек
Резюме

163
169

Припожение. Реrупярные выражения в распространенных

Язык JavaScript

171
172
173
174

Платформа

175

припожениях и языках

Утилита

grep

ЯзыкJаvа

Microsoft .NET

Язык Microsoft SQL ServerT-SQL

Microsoft Visual Studio .NЕТ
База данных MySQL
Язык Oracle PUSQL
Язык Perl
Язык РНР

Язык Pythoп
Предметный указатепь

178
178

180
182
182
183
184
187

Введение
Регулярные выражения и язык регулярных выражений
применяются уже немало лет. Знатоки регулярных выраже­

ний давно вооружились этим эффективным средством для
выполнения самых разных операций по обработке текста и
манипулирования им практически на любом языке и на лю­

бой платформе.
Но это лишь одна, приятная, сторона дела. А обратная,
неприятная, сторона состоит в том, что регулярные выраже­
ния слишком долго оставались исключительным средством

только для самых технически грамотных пользователей.

Большинство остальных не совсем понимают назначение
регулярных выражений и задачи, которые они призваны

решать. А те, кто осмелился осваивать регулярные выраже­

ния, обнаружили их синтаксис не очень понятным, а порой
и запутанным. Но на самом деле регулярные выражения не

так сложны, как кажется. Чтобы умело ими пользоваться,
достаточно уяснить поставленную задачу и ее наилучшее

решение с помощью регулярных выражений.

Отчасти упомянутые выше трудности связаны со скудос­
тью качественной литературы на данную тему. По регуляр­

ным выражениям имеется немало книг, а также немало веб­

сайтов, изобилующих учебными материалами для изучения
регулярных выражений, на которых основное внимание
уделяется синтаксису и, в частности, назначению и отличи­

ям знака

{ от знаков+

и*· Но на самом деле в этом нет ни­

чего сложного, поскольку в языке регулярных выражений

не так уж и много специальных символов. Сложнее понять,
как пользоваться ими для решения практических задач.

Эта книга не призвана служить исчерпывающим посо­

бием по регулярным выражениям. Если же вам требуется
именно такое пособие, приобретите третье издание книги

Введение

10

Mastering Regular Expressions Джеффри Фридла (Jeffrey Friedl;
издательство

O'Reilly) 1• Автор

этого исчерпывающего посо­

бия является признанным знатоком регулярных выраже­
ний, но, не в обиду ему будь сказано, его книга

-

не для

начинающих и не для случайных пользователей, которым

просто нужно решить конкретную задачу, не особенно вда­
ваясь в принцип действия регулярных выражений. Нель­

зя сказать, что от этой книги мало проку этим категориям
пользователей, но она вряд ли поможет им в решении таких
практических задач, как внедрение проверки достовернос­

ти данных, вводимых в НТМL-формах, или выполнение
простых операций замены в синтаксически анализируемом

тексте. Чтобы быстро научиться пользоваться регулярны­
ми выражениями, прочитайте эту книгу, и вы окажетесь в

положении человека, приобретшего нечто среднее между
слишком скудными сведениями, чтобы работать продук­

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

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

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

1

В русском переводе это издание книги вышло под названи­

ем Регулярные выражения в издательстве "Символ Плюс", СПб,

2008. - Примеч. ред.

Кому адресована эта книга

11

Кому адресована эта книга
Данная книга адресована тем, кто:




только начинает изучать регулярные выражения;

хочет быстро научиться извлекать наибольшую поль­
зу из языка регулярных выражений;



желает добиться преимущества, научившись решать
практические

задачи

с

помощью

одного

из

самых

эффективных (и малопонятных) инструментальных
средств;



стремится разрабатывать веб-приложения с развитой

обработкой форм и текста;



испытывает

научиться

пользоваться

поддержкой регулярных выражений в

JavaScript, Java,

.NET,

РНР,

потребность

Python, MySQL

и многих других языках,

СУБД и платформах при разработке приложений;



стремится работать продуктивно, легко и быстро,
разбираясь в регулярных выражениях без посторон­
ней помощи.

Итак, перейдите к первому уроку в данной книге, что­

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

будет невдомек, как это вы раньше умудрялись без них об­
ходиться.

Ждем ваших отзывов!
Вы, читатель этой книги, и есть главный ее критик. Мы

ценим ваше мнение и хотим знать, что было сделано нами
правильно, что можно было сделать лучше и что еще вы
хотели бы увидеть изданным нами. Нам интересны любые
ваши замечания в наш адрес.

Мы ждем ваших комментариев и надеемся на них. Вы

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

свое мнение о том, как сделать наши книги более интерес­
ными для вас.

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

Наши электронные адреса:

E-mail:
WWW:

info@dialektika. сот
http://www.dialektika. сот

Урок

1

Введение
в регулярные
выражения

Из этого урока вы узнаете, что такое регулярные выра­
жения и чем они могут вам помочь.

Потребность в реrулярных выражениях
Регулярные выражения (нередко обозначаемые на ан­

глийском как

RegEx или regex)

являются инструментальны­

ми средствами, предназначенными для решения конкрет­

ных задач. Чтобы лучше всего понять регулярные выраже­
ния и их назначение, необходимо уяснить задачу, которую
они позволяют решить.

Рассмотрим следующие примеры решаемых задач.



Найти файл, содержащий текст

car

(без учета регис­

тра букв), но только не в средине слова (например,

scar, carry и incarcerate).


При формировании веб-страницы отобразить текст,
извлеченный из базы данных. Этот текст может со­

держать

URL,

которые требуется сделать активизи­

руемыми щелчком кнопкой мыши на формируемой
странице. Таким образом, вместо самого текста до­
статочно сформировать достоверную НТМL-ссылку
.

14

Урок



1

Введение в регулярные выражения

При создании приложения с формой, в которой у
пользователя запрашиваются сведения, включающие

адрес электронной почты, проверить, указан ли адрес

в верном формате, т.е. достоверен ли он синтакси­
чески.



При редактировании исходного кода заменить все
вхождения слова

size

словом

iSize,

но только как

отдельного слова, а не части другого слова.



При отображении списка всех файлов, присутству­
ющих в файловой системе отдельного компьюте­
ра, найти только те файлы, которые содержат текст

Application.



Импортировать

данные,

разделяемые

знаками

та­

буляции, в приложение, в котором поддерживаются

файлы формата

CSV, в

котором значения в отдельных

строках разделяются запятыми, а возможно, и заклю­

чены в круглые скобки.



Найти в файле конкретный текст, но только в отдель­
ном месте (предположительно в начале строки или в

конце предложения).
Решение всех перечисленных выше примеров задач пред­

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

манипулирование символьными строками. Но насколько

сложным может оказаться решение подобных задач? Для

этого, вероятно, придется циклически перебрать слова или
отдельные символы, выполнить самые разные виды прове­

рок в условном операторе

if,

отследить немало признаков

состояния, чтобы выяснить, что удалось и что не удалось
обнаружить, проверить наличие пробелов и специальных
символов и т.д. и т.п. И каждый раз все это придется делать
вручную.

А с другой стороны, можно воспользоваться регуляр­

ными выражениями. Каждую из перечисленных выше за­
дач

можно

решить

с

помощью

грамотно

составленных

О применении регулярных выражений

15

операторов в виде очень кратких символьных строк, содер­

жащих текст и специальные инструкции, как в приведенном
ниже примере.

\Ь [Се] [Аа] [Rr] \Ь

Примечание
Если приведенная выше строка кода вам пока еще непонятна,
не отчаивайтесь. Вскоре вы поймете ее назначение.

О применении регулярных выражений
Просмотрите еще раз примеры решаемых задач, пере­

численные в предыдущем разделе, обратив внимание на то,
что все они могут быть отнесены к одной из следующих ка­

тегорий: поиск информации или же поиск и замена инфор­
мации. На самом деле поиск и замена информации

-

это ос­

новное применение регулярных выражений в простейшем

случае. Каждое регулярное выражение служит для сопо­

ставления с текстом (т.е. для выполнения операции поиска)

или же для сопоставления с текстом и его замены (т.е. для
выполнения операции замены).

Операции поиска с помощью реrулярных выражений
Регулярные выражения применяются в операциях по­

иска, когда требуется найти весьма динамичный текст, как
в упомянутом ранее примере задачи для поиска слова

Прежде всего, необходимо найти слово
даже

CaR,

car, CAR, Car

car.
или

что сделать совсем нетрудно, поскольку многие

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

carry и incarcerate

scar,

не совпадают с заданным критерием

поиска. В одних более развитых редакторах текста имеются

варианты поиска наподобие Match Only Whole Word (Найти
слово целиком), но во многих других редакторах такая воз­
можность отсутствует, что не позволяет внести подобные
изменения в редактируемый документ. В качестве выхода

Урок

16

1

Введение в регулярные выражения

из этого затруднительного положения вместо одного лишь
искомого

текста

car

можно

воспользоваться

регулярным

выражением.

Совет
Хотите знать решение упомянутой выше задачи? Оно уже было
представлено выше в следующем операторе: \Ь [Се] [Аа]

1

[Rr] \Ь.
Следует заметить, что проверка на равенство (например,

совпадает ли указанный пользователем адрес электронной

почты с данным регулярным выражением) относится к опе­
рации поиска. В этой операции осуществляется поиск на
совпадение со всей символьной строкой, введенной пользо­

вателем, в отличие от поиска подстроки, что обычно имеет
место в операциях поиска.

Операции замены с помощью реrулярных выражений
Операции поиска с помощью регулярных выражений

необыкновенно эффективны, весьма полезны и неслож­
ны в освоении, и поэтому многие уроки и примеры в дан­

ной книге, по существу, сводятся к обнаружению совпа­
Но истинный

дений.
кроется

потенциал регулярных выражений

в операциях замены,

примере задачи для замены

как

URL

в упоминавшемся

ранее

их ссылками, активизиру­

емыми щелчком кнопкой мыши на веб-странице. Для ре­
шения этой задачи необходимо сначала найти
(предположительно
ся на

http: //

или

URL

в тексте

- символьные строки, начинающие­
https: // и оканчивающиеся точкой,

запятой или пробелом). Затем требуется заменить обна­
руженный

URL

двумя вхождениями совпавшей символь­

ной строки со встроенной НТМL-разметкой. Так, строку

http://www.forta.com/

Так что же такое регулярное выражение?

17

необходимо заменить строкой
http://www.forta.
com/

Доступный в большинстве приложений вариант

and Replace

Search

(Найти и заменить) не позволяет выполнить по­

добного рода операцию, тогда как с помощью регулярных
выражений сделать это совсем нетрудно.

Так что же такое реrулярное выражение?
Итак, выяснив назначение регулярных выражений, пере­

йдем к их определению. Проще говоря, регулярные выраже­
ния

-

это символьные строки, предназначенные для сопо­

ставления с текстом и манипулирования им. Регулярные
выражения составляются на языке, специально предназна­
ченном для выполнения описанных выше и прочих опера­

ций. Подобно любому другому языку, у языка регулярных

выражений имеются свой особый синтаксис и инструкции,
которые следует изучить. Именно в этом и поможет вам
данная книга.

Язык регулярных выражений нельзя назвать полноцен­
ным языком программирования. Он даже не позволяет на­
писать конкретную программу или утилиту, которую можно

было бы установить и использовать. Чаще всего регулярные
выражения

реализуются

в

виде

мини-языков,

встраивае­

мых в другие языки или программные продукты. Приятная
сторона дела состоит в том, что регулярные выражения под­
держиваются практически во всех приличных языках про­

граммирования или инструментальных средствах, а непри­

ятная сторона

-

сам язык регулярных выражений совсем

не похож на тот язык программирования или инструмен­

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

Урок

18

1

Введение в регулярные выражения

1

Примечание
Регулярные выражения появились в результате научных ис­

следований, проводившихся в 1950-е годы в области матема­

тики. Спустя годы принципы и идеи были перенесены из этих
первоначальных исследований в среду операционной систе­

мы

Unix (в
Perl.

вания

частности, в утилиту

9rep)

и языка программиро­

Многие годы регулярные выражения, применявши­

еся для решения задач, подобных описанным ранее, приме­
нялись исключительно в сообществе пользователей

1

Unix.

Но

это положение изменилось, и теперь регулярные выражения

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

Итак, подводя итог всему сказанному выше, приведем

ряд примеров регулярных выражений (все они достоверны,
а их смысл станет вам вскоре понятен).









Ben
www\.forta\.com
[a-zA-Z0-9 - . ] *
.*
\r\n\r\n
\d{З, 3}-\d{З,

3}-\d(4, 4}

Следует особо подчеркнуть, что в овладении регулярны­
ми выражениями проще всего освоить их синтаксис. А са­
мое трудное

-

научиться применять этот синтаксис, раз­

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

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

Применение реrулярных выражений
Как пояснялось ранее, составить программу из регулярных
выражений нельзя. Это не прикладная программа, которую

Предварительные замечания

19

можно выполнить, и не программное обеспечение, которое

можно приобрести или загрузить из Интернета. Напротив,
язык регулярных выражений реализован во многих програм­
мных продуктах, языках программирования, утилитах и сре­

дах разработки.

Порядок применения регулярных выражений и доступ­

ность их функциональных возможностей может различать­
ся в разных приложениях. Так, в некоторых приложениях
могут предоставляться отдельные пункты меню и диалого­
вые окна для доступа к регулярным выражениям, тогда как
в языках программирования, как правило, предоставляются

функции, классы или объекты для раскрытия функциональ­
ных возможностей регулярных выражений. Кроме того, не
все реализации регулярных выражений одинаковы. Зачас­

тую они едва (а иногда весьма) заметно различаются син­
таксисом и доступными средствами.

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

Поэтому, прежде чем перейти к следующему уроку, обрати­
тесь за справкой к приложению по поводу того инструмен­
тального средства или

языка программирования,

которым

вы собираетесь пользоваться, изучая регулярные выражения.

Чтобы быстрее приступить к делу, ссылки на оперативно
доступные инструментальные средства проверки регуляр­

ных выражений можно найти на веб-странице, посвящен­
ной данной книге и доступной по следующему адресу:

http://forta.com/books/0134757068/
Эти инструментальные средства зачастую предоставля­
ют самый простой способ для экспериментирования с регу­
лярными выражениями.

Предварительные замечания
Прежде чем двигаться дальше, примите во внимание сле­
дующие важные замечания.



Применяя регулярные выражения, вы непременно

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

-

более быстрыми, третьи

более переносимыми, а четвертые

-

-

более пригод­

ными. При написании регулярных выражений редко
появляются верные или неверные решения, конечно,

при условии, что решение вполне работоспособно.



Как отмечалось ранее, у разных реализаций регу­

лярных выражений имеются свои особенности. По­
этому примеры и уроки в данной книге примени­

мы в как можно большей степени ко всем главным
реализациям регулярных выражений, а там, где это
уместно,



указываются

отличия

или

несоответствия.

Для овладения регулярными выражениями, как и лю­

бым языком, требуется практика, практика и еще раз

1

практика.

Примечание
Настоятельно рекомендуется опробовать каждый пример из

данной книги по мере проработки ее материала.

Резюме
Регулярные выражения относятся к числу самых эф­
фективных инструментальных средств, доступных для ма­
нипулирования текстом. Для составления регулярных вы­

ражений (а по существу, символьных строк, называемых

регулярными выражениями)

имеется специальный язык.

Регулярные выражения служат для выполнения операций
поиска и замены.

Урок

2

Обнаружение
совпадения
с отдельными
символами

Из этого урока вы узнаете, как обнаружить совпадение с
одним или несколькими символами.

Совпадение с обычным текстом
Имя

Ben -

это регулярное выражение. Это простой

текст, и поэтому он может быть непохожим на регулярное
выражение. Регулярные выражения могут содержать прос­

той текст

-

и даже один лишь простой текст. Следует, одна­

ко, признать, что такое употребление регулярных выраже­

ний считается напрасной тратой ресурсов на их обработку,
хотя и служит неплохой отправной точкой для изучения
регулярных выражений.

Итак, рассмотрим следующий пример регулярного выра­

жения, состоящего только из обычного текста.

Текст

Hello, my name is Ben. Please visit
my website at http://www.forta.com/. 1
1

Здравствуйте, меня зовут Бен.

мой веб-сайт по адресу

Будьте любезны,

http://www.forta.com/.

посетите

Урок

22

2

Обнаружение совпадения с отдельными символами

Регулярное выражение

Ben
Результат

. Please visit
Hello, my name is
my website at http://www.forta.com/.
Анализ
В качестве регулярного выражения здесь был использо­
ван обычный текст, который совпал со словом Ben в исход­
ном тексте данного примера.

Примечание
В примерах из этой книги совпавший текст специально вы­
деляется для большей наглядности как результат применения
регулярного выражения.

Рассмотрим еще один пример применения того же само­

го исходного текста, но для обнаружения совпадения с дру­
гим регулярным выражением.

Текст

Hello, my name is Ben. Please visit
my website at http://www.forta.com/.
Регулярное выражение

my
Результат

Hello, my name is Ben. Please visit
website at http://www.forta.com/.

Совпадение с обычным текстом

23

Анализ
Искомый текст ту также является статическим, но обра­
тите внимание на то, что в исходном тесте обнаружены два
совпадения с ним.

Количество совпадений
По умолчанию большинство механизмов обработки ре­
гулярных выражений должны возвращать только первое со­
впадение. В приведенном выше примере таким совпадением

оказывается первое, но не второе слово ту. Так почему же

были обнаружены два совпадения? В большинстве реали­
заций регулярных выражений предоставляется механизм

для получения списка всех совпадений (этот список обычно
возвращается в массиве или в какой-то другой специальной

форме). Так, если установить в
признак

g,

JavaScript

дополнительный

обозначающий глобальное совпадение, то в ко­

нечном счете будет возвращен массив, содержащий все сов­
падения.

Примечание
Чтобы выяснить, как организовать глобальное совпадение в
конкретном языке программирования или инструментальном

средстве, обращайтесь за справкой к приложению, приведен­
ному в конце данной книги.

Учет регистра букв
В регулярных выражениях учитывается регистр букв, и
поэтому слово

Ben

не совпадет со словом

шинстве реализаций

ben.

Но в боль­

регулярных выражений

поддержи­

вается также обнаружение совпадений без учета регистра

букв.

Например, программирующие на

установить дополнительный признак

i,

JavaScript

могут

чтобы принуди­

тельно организовать поиск без учета регистра букв.

Урок

24

2

Обнаружение совпадения с отдельными символами

Примечание
Чтобы выяснить, как организовать поиск без учета регистра
букв в конкретном языке программирования или инструмен­

тальном средстве, обращайтесь за справкой к приложению,
приведенному в конце данной книги.

Совпадение с любыми символами
Рассмотренные до сих пор регулярные выражения по­

зволяли обнаруживать совпадение только со статическим
текстом, что, конечно, малоинтересно. Поэтому рассмотрим
далее совпадение с неизвестными заранее символами. Для

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

словами

cat

и

cot

t

приведет к совпадению со

(и целым рядом других бессмысленных

слов).
Ниже приведен пример применения регулярного выра­
жения со знаком точки.

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Реrулярное выражение

sales.

Совпадение с любыми символами

25

Результат
;н:&,~:f,1,т. х 1 s
ordersЗ.xls

SiiRSe xls
\ftftJll,~

xls
apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Анализ
В данном примере регулярное выражение

sales.

ис­

пользуется для поиска всех имен файлов, начинающихся со
слова

sales,

после которого следует любой другой символ.

С этим шаблоном совпали имена трех из девяти файлов.

1

Совет

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

Примечание
Следует иметь в виду, что в регулярных выражениях осущест­
вляется сопоставление строкового содержимого с заданным

шаблоном. В итоге с шаблоном не всегда совпадают целые
строки, а только отдельные символы

-

даже если они состав­

ляют лишь часть строки. В приведенном выше примере регу­

лярное выражение совпало не со всем именем файла, а толь­
ко с его частью.
передавая

Об этом отличии очень важно не забывать,

результаты

применения

регулярного

выражения

в какую-нибудь другую часть прикладного кода для последую­
щей обработки.

Точка обозначает совпадение с любым одиночным сим­
волом, будь то буква, цифра и даже сам знак точки, как де­
монстрируется в следующем примере.

Урок 2 Обнаружение совпадения с отдельными символами

26
Текст

sales.xls
salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Регулярное выражение

sales.
Результат
§~~xls

&1881.xls
ordersЗ.xls

saf'"d2. xl s
8&1118.xls
apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Анализ
В данном примере добавлен один дополнительный файл

sales. xls.

Имя этого файла совпало с шаблоном

поскольку знак

.

sales.,

обозначает совпадение с любым одиноч­

ным символом, включая и сам знак точки.

В разных местах шаблона можно употреблять несколь­
ко экземпляров знака

например

..

.

как вместе (т.е. один после другого,

для обнаружения совпадения с любыми дву­

мя соседними символами), так и порознь. Рассмотрим еще
один

пример

применения

того

же

самого

исходного тек­

ста. На этот раз требуется найти все файлы для Северной

Совпадение с любыми символами

Америки

(na)

и Южной Африки

(sa)

27

независимо количес­

тва последующих цифр.
Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Реrvлярное выражение
.а.

Результат

wesl.xls
ordersЗ.xls

sales2.xls
Sa!esЗ.xls
apa~l.xls

europe2.xls
nal.xls
na2.xls
~at.xls

Анализ
С помощью регулярного выражения

удалось обнаружить файлы

nal, na2

и

.а.
sal,

действительно

но, кроме них,

есть еще четыре не предполагавшихся совпадения. Почему~
А потому, что шаблон в этом регулярном выражении совпа­
дает с тремя любыми символами, при условии, что вторым
из них оказывается символ а.

Опробуем другой шаблон, добавив еще один знак точки

к шаблону

. а . , как

показано в следующем примере.

Урок

28

Обнаружение совпадения с отдельными символами

2

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Реrvлярное выражение


..

Результат
И"lesl.xls
ordersЗ.xls

-s2.xls
smsЗ.xls

a-.xls
europe2.xls
~ixls

~xls

Иi:txls

Анализ
Шаблон

.а. .

оказался ничуть не лучше шаблона

. а ..

Присоединение к нему еще одного знака точки обеспечило

лишь совпадение с дополнительным символом, каким бы он
ни был. Как же тогда найти знак точки, если он имеет специ­
альное назначение для совпадения с любым символом?

Совпадение со специальными символами
Знак точки имеет специальное назначение в регулярных

выражениях. Если этот знак требуется употребить в ша­
блоне, придется каким-то образом указать, что в регуляр­

ном выражении он должен выполнять свое обычное, а не

Совпадение со специальными символами

29

специальное назначение. Для этого достаточно экраниро­

вать, а по существу, предварить знак точки знаком обратной

косой черты(\). Этот знак служит в качестве метасимвола,
т.е. символа со специальным назначением, в отличие от его

прямого назначения как знака обратной косой черты. Таким
образом, знак
а знаки

\ . -

.

обозначает совпадение с любым символом,

непосредственно знак точки.

Рассмотрим предыдущий пример снова, но на этот раз

экранируем знак точки в шаблоне знаком обратной косой
черты, как показано ниже.

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Реrvлярное выражение
.а.\.

Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
ul?~xls

na:2'•xls
нl•xls

Анализ
Благодаря шаблону

. а. \ .

поставленная цель достигну­

та. Первый знак точки в этом шаблоне обеспечил совпадение

Урок 2 Обнаружение совпадения с отдельными символами

30

с буквой

n

(в первых двух случаях) или с буквой

тьем случае), второй знак точки

-

(в первых двух случаях) или с цифрой
а последующие знаки

\. -

s

(в тре­

совпадение с цифрой

2

1

(в третьем случае),

совпадение со знаком точки, от­

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

xls,

чтобы исключить совпадение с такими именами файлов, как
sаЗ.

doc.

Ниже приведен соответствующий пример.

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
Реrvлярное выражение

.a.\.xls
Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls

~··
В регулярных выражениях знак\ всегда обозначает на­
чало блока, состоящего из одного или нескольких символов,
имеющих специальное назначение. В приведенных выше

Резюме

31

примерах было продемонстрировано употребление знака

\

в блоке символов \.,а на последующих уроках будут пред­
ставлены другие примеры применения этого знака.

Пример
Применение специальных символов более подробно рассмат­
ривается в уроке

1

4.

Пример
Если знак

\

требуется употребить в шаблоне непосредствен­

но как знак обратной косой черты, его следует экранировать,

указав в итоге два знака\\.

Совет

1

Как пояснялось выше, знак точки обозначает совпадение с

любым одиночным символом. И это действительно так в боль­
шинстве реализаций регулярных выражений, кроме знака новой строки.

Резюме
Регулярные выражения, иначе называемые шаблонами,

представляют собой строки, состоящие из символов. Эти
символы могут быть обычными, образующими текст, или
метасимволами, имеющими специальное назначение. Из

этого урока вы узнали, как обнаружить совпадение с оди­
ночным символом, используя обычный текст и метасимво­

лы. В частности, знак точки

( . ) обозначает совпадение с лю­
(\)

бым одиночным символом, а знак обратной косой черты

служит для экранирования символов и обозначает начало
последовательности специальных символов.

Урок

3

Совпадение

с набором символов
Из этого урока вы узнаете, как обращаться с наборами
символов. В отличие от знака точки, обозначающего совпа­
дение с любым одиночным символом, как пояснялось в пре­
дыдущем уроке, наборы позволяют обнаруживать совпаде­
ния с конкретными символами и их диапазонами.

Совпадение с одним из нескольких символов
Как вам должно быть уже известно из предыдущего уро­
ка, знак точки обозначает совпадение с любым одиночным
символом, как это происходит с любым указанным обыч­
ным символом. В последнем примере из предыдущего урока

шаблон



обеспечивал совпадение как с символами

и с символами

sa, а знак . -

na, так

совпадение с обоими символа­

ми,

n и а. Но что если среди искомых файлов имеется файл
cal. xls с данными о продажах в Канаде, но по-прежнему

требуется обнаружить совпадение только с файлами, со­
держащими данные о продажах в Северной Америке

Южной Африке

(sa)?

Знак

.

волом с, а следовательно, будет обнаружен и файл
как показано ниже.

(na)

и

обеспечит совпадение и с сим­

cal. xls,

34

Урок

3

Совпадение с набором символов

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
cal.xls
Реrvлярное выражение

.a.\.xls
Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

--

apacl.xls
europe2.xls

Чтобы найти символ

или

n

s,

совсем не обязательно

обеспечить совпадение с любым символом. Для этого до­
статочно и совпадения именно с этими двумя символами.

В регулярных выражениях наборы символов определяются
с помощью метасимволов

[

и

].

Эти метасимволы задают

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

набором символов.

Совпадение с одним из нескольких символов

35

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
nal.xls
na2.xls
sal.xls
cal.xls
Реrулярное выражение

[ns]a.\.xls
Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
n61~k111'
~+;~s
sа1~и1э

cal.xls
Анализ
Регулярное выражение, применяемое в данном приме­

ре, начинается с набора символов
совпадение с буквой

n

или

s,

[ns],

но не с буквой с или любым

другим символом. Знаки открывающей

(] )

обеспечивающего

( [)

и закрывающей

скобок определяют сопоставляемый набор символов, а

не любые символы. Символ а в шаблоне из данного примера
обеспечивает совпадение с буквой а, знак

. - совпадение с
\ . - совпадение со
расширением файла xls.

любым последующим символом, знаки
знаком точки, а символы

xls -

с

По такому шаблону обнаруживается совпадение только с

тремя требующимися именами файлов.

Урок

36

3

Совпадение с набором символов

Примечание
На самом деле шаблон

[ns] а.\. xls

не совсем подходит для

рассмотренного выше примера. Так, если бы существовал
файл

usal. xls, он так же совпал бы с данным шаблоном (на­
u была бы проигнорирована, а остальная часть
usal. xls имени файла совпала бы). В качестве выхода из
чальная буква

этого положения можно организовать совпадение позиций,
более подробно рассматриваемое в уроке

6.

Совет
Как видите, проверить правильность регулярных выражений
не так-то просто. Проверить, совпадает ли шаблон именно с
тем, что нужно, совсем нетрудно. Но настоящие трудности воз­
никают, когда требуется проверить, не совпадает ли шаблон и
с тем, что не нужно.

Наборы символов нередко применяются для поиска все­

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

Текст

The phrase "regular expression" is often
abbreviated as RegEx or regex. 1
Реrvлярное выражение

[Rr]eg[Ee]x
Результат

The phrase "regular expression" is often
abbreviated as or
Анализ
Шаблон, применяемый в данном примере, содержит два
набора символов. В частности, набор

1

Термин

редко

[Rr]

"regc;lar expression" (регулярное
как RegEx или regex.

сокращается

обеспечивает

выражение)

не­

Применение диапазонов в наборах символов

совпадение с буквами R и

r,

а набор [Ее] -

37

совпадение с

буквами Е и е. Таким образом, в исходном тексте обнару­
живается совпадение со словами

RegEx и regex. Тем не ме­

нее данный шаблон не обеспечивает совпадение со словом

REGEX.

1

Совет

Для совпадения без учета регистра букв приведенный выше
метод оказывается излишним. Ведь такого рода совпадение
применяется только в операциях поиска с учетом

регистра

букв, которые частично выполняются без учета регистра букв.

Применение диапазонов в наборах символов
Обратимся снова к примеру со списком файлов.Шабло­
ну

[ ns] а. \. xls,

применявшемуся в последнем примере

для поиска файлов, присущ еще один недостаток. Что если

в списке имеется файл

sam. xls?

Он также совпал бы с дан­

ным шаблоном, поскольку знак точки обозначает совпаде­
ние с любым символом, а не только с цифрой.
И этот недостаток позволяют устранить наборы симво­
лов, как показано ниже.

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
sam.xls
nal.xls
na2.xls
sal.xls
cal.xls
Регулярное выражение

[ns]a[Ol23456789]\.xls

Урок З

38

Совпадение с набором символов

Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
sam.xls

cal.xls
Анализ

В данном примере шаблон был видоизменен таким об­
разом, чтобы первым совпала буква

буква а, а третьей

-

n

или

s,

второй

-

любая цифра, как указано в наборе

(0123456789). Обратите внимание на то, что файл sam.

xls

не совпал с данным шаблоном, поскольку буква

mне со­

впадает с перечисленным в нем набором символов, состоя­
щим из десяти цифр.
Работая с регулярными выражениями, вы обнаружите,

что вам придется не раз употреблять диапазоны символов
(от О до

9, от А до Z и т.д.).

Чтобы упростить работу с диапа­

зонами символов, в регулярных выражениях предоставля­

ется специальный метасимвол

-

(знак дефиса), предназна­

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

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
sam.xls
nal.xls

Применение диапазонов в наборах символов

39

na2.xls
sal.xls
cal.xls
Реrvлярное выражение

[ns]a[0-9]\.xls
Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
sam.xls
..:ъwа

cal.xls
Анализ
Шаблон

[0-9] функционально равнозначен шаблону

[О 12 3 4 5 6 7 8 9]

,

а следовательно, и полученный результат

оказывается таким же, как и в предыдущем примере.

Диапазоны не ограничиваются только цифрами. Ниже
перечислены все допустимые диапазоны символов.



А- Z -

обеспечивает совпадение со всеми прописны­

ми буквами от А до



а- z

-

обеспечивает совпадение со всеми строчными

буквами от а до



A-F -

z.

обеспечивает совпадение только с прописны­

ми буквами от А до



А- z

-

в коде

Z.

F.

обеспечивает совпадение со всеми символами

ASCII

от А до

z.

Этот диапазон не вполне при­

годен для составления шаблонов, поскольку включает
в себя такие символы, как

[ и л, которые находятся в
Z и а в таблице символов,
коде ASCII.

промежутке между буквами
представленных в

Урок

40

Совпадение с набором символов

3

Любые два символа в коде

ASCII

могут быть указаны

в качестве начала и конца конкретного диапазона. Но на

практике диапазоны обычно составляются из некоторых

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

1

указать конец диапазона меньше его начала, как. например,

[З-1]. Такой диапазон непригоден для шаблона. поскольку он

зачастую препятствует нормальному действию шаблона.

1

Примечание
Знак дефиса(-)- это специальный метасимвол, поскольку он
употребляется как метасимвол. когда указывается в наборе.
заключаемом между знаками

бора знак



-

[

и

].А

за пределами этого на­

употребляется как таковой, обеспечивая совпаде­

ние только со знаком дефиса. Следовательно, знак

-

совсем

необязательно экранировать .

Несколько диапазонов могут быть объединены в единый

набор символов. Так, следующий шаблон совпадает с любым

буквенно-цифровым символом в верхнем или нижнем реги­
стре, но ни с каким другим символом, который не является

ни цифрой, ни буквой:

[A-Za-z0-9]
Этот шаблон является сокращенной формой приведен­
ного ниже шаблона. Как видите, диапазоны делают намного

более ясным синтаксис регулярных выражений.
[AВCDEFGHIJKLМNOPQRSTUVWXYZabcde

fghijklmnopqrstuvwxyz01234567890]
Рассмотрим еще один пример, в котором осуществляет­

ся поиск значений цвета

RGB,

обозначающих в шестнадца­

теричной форме количество основных (красной, зеленой и
синей) составляющих отдельного цвета. На неб-страницах
значения цвета

RGB

указываются как

#000000

(черный),

Применение диапазонов в наборах символов

#ffffff

(белый),

#ffOOOO

41

(красный) и т.д. А поскольку эти

значения могут быть указаны как в верхнем, так и в нижнем
регистрах букв, значение

#FFOOff

(пурпурный) вполне до­

пустимо. Приведенный ниже пример взят из файла стиле­
вых таблиц

CSS.

Текст

body {
background-color: #fefbdB;
}

hl {
background-color: #OOOOff;
div
background-color: #d0f4e6;
}

span {
background-color: #f08970;

Реrулярное выражение

# [0-9A-Fa-f) [0-9A-Fa-f] [0-9A-Fa-f) [0-9A-Fa-f)
[0-9A-Fa-f) [0-9A-Fa-f)
Результат

body {
background-color: #fefbd8;
}
hl {

background-color:

OOOOff;

}

div
background-color:
}

span {
background-color:

Анализ
Шаблон, применяемый в данном примере, состоит из

знака

#

как обычного текстового символа и диапазона

Урок З

42

символов

Совпадение с набором символов

[0-9A-Fa-f],

повторяющегося шесть раз под­

ряд. Такой шаблон обеспечивает совпадение со знаком

#

и шестью последующими символами, каждый из которых

должен быть цифрой или буквой от А до F (прописной или
строчной).

Совпадение с любыми символами,
кроме указанных
Наборы символов обычно служат для указания списка

символов, любой из которых должен совпасть. Но иногда
требуется обратное: список символов, которые не должны

совпасть. Иными словами, совпасть должны любые симво­
лы, кроме указанных в списке.

Вместо того чтобы перечислять каждый требующийся
символ, что может быть долго, если требуются все симво­

лы, кроме нескольких, наборы символов можно указывать с
отрицанием, используя метасимвол
ветствующий пример.

Текст

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
sam.xls
nal.xls
na2.xls
sal.xls
cal.xls
Реrvлярное выражение
[ns]a[л0-9]\.xls

". Ниже приведен соот­

Резюме

43

Результат

salesl.xls
ordersЗ.xls

sales2.xls
salesЗ.xls

apacl.xls
europe2.xls
s
nal.xls
na2.xls
sal.xls
cal. xls
Анализ
Шаблон, применяемый в данном примере, полностью
противоположен шаблону из предыдущего примера. Если
шаблон

[ 0- 9]

обеспечивает совпадение со всеми цифрами

(и только с ними), то шаблон

[ "0-9] -

совпадение с любы­

ми символами, кроме цифр в указанном диапазоне. Таким
образом, по шаблону

файл

sam. xls,

[ns]a["0-9] \.xls обнаруживается
nal. xls, na2. xls или sal. xls.

но не файл

8 Примечание
Метасимвол

"

обозначает отрицание всех символов или диа­

пазона из набора символов, а не только символа или диапазо­

на, который он предваряет.

Резюме
Метасимволы

[

и

]

служат для обозначения наборов

символов, любой из которых должен совпасть (по логичес­
кой операции ИЛИ, а не И). Можно перечислять наборы
символов полностью или указывать лишь

пользуя метасимвол

- . Кроме того,

их пределы,

ис­

наборы символов можно

отрицать, используя метасимвол л, чтобы обеспечить сов­

падение с любыми символами, кроме указанных.

Урок

4

Применение
метасимволов

Некоторые метасимволы были представлены в уроке

2.

А из этого урока вы узнаете о других метасимволах, приме­
няемых для совпадения с конкретными символами или их
типами.

Еще раз об экранировании
Прежде чем перейти непосредственно к описанию мета­

символов, целесообразно еще раз упомянуть об экраниро­
вании специальных символов. Метасимволами называют­
ся такие символы, которые имеют специальное назначение

в регулярных выражениях. Например, знак точки

(.)

явля­

ется метасимволом и обозначает совпадение с любым оди­
ночным символом, как пояснялось в уроке

ющей квадратной скобки

2. Знак открыва­
( [) также является метасимволом

и обозначает начало набора символов, как пояснялось в
уроке

3.

Метасимволы приобретают особое значение, когда они
употребляются в регулярных выражениях, и поэтому эти
символы нельзя использовать как таковые. Например, знак

[

нельзя использовать для совпадения непосредственно

с открывающей квадратной скобкой, а знак

. -

с точкой.

Рассмотрим следующий пример, в котором регулярное вы­

ражение применяется для того, чтобы обнаружить совпаде­
ние с массивом

JavaScript, содержащим знаки [

и

].

Урок

46

4

Применение метасимволов

Текст

var myArray

new Array();

=

i f (myArray[OJ

0) {

Реrvлярное выражение

myArray[OJ
Результат

var myArray

new Array();

=

if (myArray[O]

0) {

Анализ
В данном примере блок текста представляет собой фраг­
мент исходного кода на языке

JavaScript.

Обычно регуляр­

ные выражения применяются в редакторах текста. А в дан­
ном

примере

предполагалось,

что

регулярное

выражение

myArray [О] буквально совпадет с аналогичным текстом во
фрагменте кода, но этого не произошло. Почему? А потому,
что метасимволы

[

и

]

обозначают в регулярном выраже­

нии набор символов, а не собственно знаки

[

и

] . А раз

так,

то шаблон myArray [О] совпадет с именем массива myArray
и одним из членов набора, в котором указан единственный
символ О. Следовательно, шаблон
лишь с текстом

myArray [О] совпадет

myArrayO.

Как пояснялось в уроке

2,

метасимволы можно экрани­

ровать, предваряя их знаком обратной косой черты. Так,
шаблон

\,

совпадает со знаком точки, а шаблон

\ [ -

со

знаком открывающей квадратной скобки. Каждый метасим­
вол можно экранировать знаком обратной косой черты, и
тогда обеспечивается совпадение с самим символом, а его

Еще раз об экранировании

специальное

назначение

как

метасимвола

47

игнорируется.

Следовательно, для совпадения непосредственно со знака­

ми

и

[

]

их необходимо экранировать. Ниже приведен пре­

дыдущий пример, но на этот раз метасимволы в шаблоне
экранированы.

Текст

var myArray

=

new Array();

if (myArray[O]

О)

{

Регулярное выражение

myArray\ [0\]
Результат

var myArray

new Array () ;

if

0)

{

Анализ
На этот раз поиск достиг цели. Шаблон
ком

[,

а шаблон

\] -

со знаком

] . Таким

\ [ совпал со зна­
образом, с помо­

щью регулярного выражения myArray\ [О\] было обнару­
жено совпадение с элементом массива

myArray [О].

Применение регулярного выражения в рассмотренном
выше примере оказывается несколько излишним, посколь­

ку для поиска нужного текста было бы достаточно и намно­

го проще указать искомый текст. Но допустим, что требу­
ется обнаружить совпадение не только с элементом масси­
ва

myArray[O], но и с элементами массива myArray[l],
myArray[2] и т.д. В таком случае применение регулярного
выражения приобрело бы намного больший смысл. Для это­
го следовало бы экранировать метасимволы

[

и

]

и указать

Урок

48

4

Применение метасимволов

между ними символы, которые должны совпасть. Так, если

требуется обнаружить совпадение с элементами массива
О- 9, то с этой целью можно воспользоваться следующим ре­
гулярным выражением:

myArray\ [ [0-9] \]
Совет

1

Любой метасимвол, а не только упоминавшиеся выше, можно

экранировать, предварив его знаком обратной косой черты.

1

Предупреждение
Метасимволы, указываемые парой (например, знаки

[

и

] ),

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

Как правило, для экранирования

меняется знак

\.

метасимволов при­

Это означает, что знак

\,

который также

является метасимволом, употребляется для экранирования
других символов. Но, как отмечалось в уроке

менения знака

\

2,

для при­

как такового в регулярном выражении, а

не как метасимвола, его также следует экранировать им же

самим:\\.
Рассмотрим следующий пример. В качестве исходного

текста в данном примере служит путь к файлу в

Windows,

в котором для этой цели употребляются знаки обратной ко­
сой черты. Допустим теперь, что этим путем к файлу тре­
буется воспользоваться в

Linux,

а следовательно, найти все

знаки обратной косой черты и заменить их знаками косой
черты.

Текст

\home\ben\sales\
Реrулярное выражение

\\

Совпадение с пробельными символами

49

Результат

\home\ben\sales\
Анализ
Шаблон

\\

совпадает со знаком

\,

и поэтому в данном

примере обнаружены четыре знака обратной косой черты.
Если указать только один знак

\

в регулярном выражении,

это, вероятнее всего, приведет к ошибке, поскольку синтак­
сический анализатор регулярных выражений вполне обос­
нованно предположит, что указанное регулярное выраже­

ние не завершено. Ведь после знака

\

в регулярном выра­

жении должен следовать еще один символ.

Совпадение с пробельными символами
Как правило, метасимволы делятся на две следующие ка­

тегории: применяемые для совпадения с текстом (например,
знак

.)

и употребляемые как часть синтаксиса регулярных

выражений (например, знаки

[

и

] ).

Вам предстоит еще от­

крыть немало других метасимволов обеих категорий, начи­

ная с пробельных символов.
Когда поиск выполняется с помощью регулярных вы­

ражений, то нередко требуется обнаружить совпадение с
непечатаемыми пробельными символами, вводимыми в ис­

ходный текст. Например, в исходном тексте требуется найти
все знаки табуляции или разрыва строк. Ввести пробельные
символы непосредственно в регулярное выражение не так­

то просто, поэтому для этой цели можно воспользоваться

специальными символами, перечисленными в табл.
Таблица

4.1.

4.1.

Пробельные метасимволы

Метасимвол

Описание

[\Ь]

Возврат на один символ

("забой")

\:f

Перевод страницы

\n

Перевод строки

Урок

50

4

Применение метасимволов

Окончание табл.
Метасимвол

Описание

\r
\t
\v

Возврат каретки

4.1

Табуляция
Вертикальная табуляция

Обратимся к конкретному примеру. Приведенный ниже
блок текста содержит ряд записей в формате с разделяющи­
ми запятыми, сокращенно обозначаемом как

CSV.

Прежде

чем обрабатывать эти записи, необходимо удалить любые
пустые строки в исходных данных, как показано ниже.

Текст
11
11

11
11

101 11 , 11 Ben 11 , 11 Forta"
102 11 , 11 Jim 11 , 11 James 11

103 11 , 11 Roberta 11 , 11 Robertson 11
104 11 , 11 ВоЬ 11 , 11 Bobson 11

Реrулярное выражение

\r\n\r\n
Результат
11
11

101 11 , "Ben 11 , 11 Forta"
102 11 , 11 Jim 11 , "James 11

103 11 , 11 Roberta 11 , 11 Robertson 11
"104", 11 ВоЬ 11 , 11 Bobson"

11

Анализ
Шаблон

\r\n

совпадает с последовательностью знаков

возврата каретки и перевода строки, которая в

Windows слу­

жит в качестве маркера конца строки. Таким образом, поиск

по шаблону

\r\n \r\n

приведет к обнаружению совпадения

Совпадение с отдельными типами символов

51

двух маркеров конца строки, а следовательно, и двух пустых
строк, находящихся между двумя записями.

Совет
Как пояснялось выше, последовательность знаков возврата

\r\n,

каретки и перевода строки, совпадающая с шаблоном
служит в операционной системе

Windows

в качестве маркера

конца строки. Но в операционных системах

Unix, Linux

и Мае

ОSХдля этой цели служит лишь знак перевода строки, поэтому
в этих системах, вероятнее всего, придется воспользоваться

более простым шаблоном, состоящим только из метасимвола

\n. А

в идеальном регулярном выражении, вероятно, должны

быть учтены оба варианта обозначения конца строки: необя­

зательный метасимвол

\r

и обязательный метасимвол

\n.

Мы еще вернемся к этому примеру на следующем уроке.

На практике вам,

вероятнее всего, придется

не раз

встречаться с примерами применения метасимволов
и

\ t.

\r, \n

А остальные пробельные метасимволы применяются

нечасто.

Примечание
Выше была продемонстрирована иная разновидность мета­

символов. Так, знаки.

и

[

считаются метасимволами, если

они не экранированы, а такие буквы, как

f и n, -

только в том

случае, если они экранированы. Если же эти буквы не экрани­
рованы, то они употребляются в регулярных выражениях как
таковые.

Совпадение с отдельными типами символов
До сих пор было показано, каким образом обнаруживает­
ся совпадение с отдельными символами, любыми символами
(с помощью знака
щью знаков

. ) и одним из наборов символов (с помо­
[ и ] ) и как отрицаются совпадения (с помощью

знака"). Наборы символов, в которых обеспечивается совпа­

дение с одним из символов, считаются наиболее употреби­
тельной формой совпадения, а вместо часто употребляемых
наборов символов могут быть использованы специальные

52

Урок

4

Применение метасимволов

метасимволы. Такие метасимволы соответствуют классам

символов. На самом деле метасимволы классов вообще не
нужны, поскольку можно всегда перечислить совпадающие

символы или указать их диапазоны. Но такие метасимволы,

без сомнения, приносят необыкновенную пользу.
Примечание

1

Упоминаемые далее классы поддерживаются как основные
практически во всех реализациях регулярных выражений.

Совпадение с цифровыми и не цифровыми символами
Как вам должно быть уже известно из урока
символов

[ 0-9]

3,

диапазон

служит сокращенным обозначением диа­

пазона символов [О 12 3 4 5 6 7 8 9] и обеспечивает совпадение

с любой цифрой. А для совпадения с любым другим симво­
лом, кроме цифры, можно воспользоваться отрицательной

формой

[ "0- 9]

такого диапазона символов. Сокращенные

формы классов для цифровых и не цифровых символов пе­
речислены в табл.
Таблица

4.2.

4.2.

Цифровые и нецифровые метасимволы

Метасимвол

Описание

\d
\D

Любая цифра (то же, что и

[0-9])

Любой символ, кроме цифры (то же, что и
[ЛQ-9])

Чтобы продемонстрировать применение этой разновид­
ности

метасимволов,

вернемся

примеру.

Текст

var myArray

=

if (myArray[O]

new Array();
0) {

к

рассмотренному

ранее

Совпадение с отдельными типами символов

53

Реrvлярное выражение

myArray\ [ \d\]
Результат

var myArray
if

new Array () ;
0)

{

Анализ
Шаблон

\ [

совпадает со знаком

любой одиночной цифрой, а шаблон
довательно, с помощью регулярного

[, метасимвол \ d - с
\] - со знаком ] ; сле­
выражения myArray\

[ \d\] обнаруживается совпадение с элементом массива
myArray [О]. РегулярноевыражениеmуАrrау\ [ \d\] служит
сокращенной формой регулярного выражения myArr а у\ [ 09 \] , а последнее, в свою очередь, - сокращенной формой
регулярного выражения myArray\ [0123456789\]. С помо­
щью этого регулярного выражения обнаруживается также
совпадение с элементами массива

myArray [1], myArray (2)
myArray [ 10].

и так далее, но не с элементом массива

1

Совет
Как видите, определить любое регулярное выражение прак­

тически всегда можно несколькими способами. И вы вольны

выбрать такой способ, какой вам больше всего подходит.

Предупреждение
В синтаксисе регулярных выражений учитывается регистр
букв. В частности, метасимвол
цифрами, тогда как метасимвол

\d обозначает
\D - наоборот,

совпадение с
с нецифровы­

ми символами. То же самое справедливо не только для других
рассматриваемых далее метасимволов классов, но даже для

совпадения без учета регистра букв. В последнем случае ре­
гистр букв не будет учитываться в совпадающем тексте, тогда
как в специальных символах (например,
учитываться.

\d)

он асе же будет

Урок

54

4

Применение метасимволов

Совпадение с буквенно-цифровыми
и не буквенно-цифровыми символами
Еще одним часто употребляемым набором являются

буквенно-цифровые символы: буквы от А до Z (как пропис­
ные, так и строчные), цифры и знак подчеркивания, неред­

ко применяемый в именах файлов и каталогов, прикладных
переменных, объектов базы данных и прочих элементов.

Сокращенные формы классов для буквенно-цифровых сим­
волов перечислены в табл.
Таблица

4.3.

4.3.

Буквенно-цифровые метасимволы

Метасимвол

Описание

\w

Любой буквенно-цифровой символ в верхнем
или нижнем регистре, а также знак подчеркива­

ния (то же, что и

[a-zA-Z0-9_])

Любой не буквенно-цифровой символ или знак

\W

подчеркивания (то же, что и

[ лa-zA-Z0-9_])

В следующем примере используется фрагмент из базы
данных, состоящий из записей с

США и Канады.

Текст

11213
А1С2Е3

48075
48237
М1В4F2

90046
Н1Н2Н2

Реrулярное выражение

\w\d\w\d\w\d

почтовыми индексами

Совпадение с отдельными типами символов

55

Результат

11213
М'СШ

48075
48237
IП:&tl'a

90046
Н1В2112

Анализ
В шаблоне из данного примера метасимволы

\ wи \ d при­

меняются для извлечения канадских почтовых индексов.

Примечание
На первый взгляд, приведенный выше пример составлен пра­
вильно, но так ли это? Подумайте, почему почтовые индексы
США не совпали с шаблоном из данного примера? В том ли
дело, что они состоят только из цифр, или для этого имеются

иные причины?
Здесь не даются ответы на эти вопросы просто потому, что ша­
блон из данного примера действует должным образом. Важ­
нее подчеркнуть другое: если регулярные выражения вполне

работоспособны, то они редко бывают верными или неверны­
ми. Чаще всего они различаются степенью сложности, которая

соответствует разной степени строгости сопоставления с ша­
блоном.

Совпадение с пробельными
и не пробельными символами
И наконец, рассмотрим класс пробельных метасимво­
лов. Как пояснялось ранее, для обозначения отдельных про­
бельных символов имеются соответствующие метасимво­
лы. Сокращенные формы классов для всех пробельных и не
пробельных символов перечислены в табл.

4.4.

Урок

56

Таблица

4

4.4.

Применение метасимволов

Пробельные

и не пробельные метасимволы
Метасимвол

Описание

\s

Любой

\S

Любой не пробельный символ (то же, что и

пробельный

символ

(то

же,

что

и

[\f\n\r\ t\v])
["\f\n\r\ t\v])

1

Примечание
Метасимвол

[\Ь], обозначающий возврат на один символ

или "забой", не включается в число пробельных символов,

определяемых метасимволом

\s,

не исключается из числа не

пробельных символов, определяемых метасимволом

\S.

Обозначение шестнадцатеричных

и восьмеричных значений
Несмотря на то что обозначать отдельные символы их
шестнадцатеричными

или

восьмеричными

значениями

вряд ли придется на практике, упомянуть о такой возмож­
ности все же стоит.

Обозначение шестнадцатеричных значений
Шестнадцатеричные значения (по основанию

16)

могут

быть указаны с префиксом \х. Так, шестнадцатеричное
значение \хОА, обозначающее АSСП-код

10

знака перевода

строки, функционально равнозначно метасимволу

\n.

Обозначение восьмеричных значений
Восьмеричные (по основанию

8)

значения могут быть

указаны в виде чисел, состоящих из двух или трех цифр и
предваряемых префиксом \О. Так, восьмеричное значение

\011,

обозначающее АSСП-код

9 знака
\ t.

онально равнозначно метасимволу

табуляции, функци­

Применение классов символов

57

POSIX

Примечание
Во многих реализациях регулярных выражений допускается
также обозначать управляющие символы с помощью мета­

символа \с. Например, шаблон
клавиш

.

\cz совпадет с

комбинацией

Но такой синтаксис редко придется приме­

нять на практике.

Применение классов символов

POSIX

Урок, посвященный метасимволам и сокращенным фор­
мам различных наборов символов, был бы неполным без упо­
минания о классах символов

POSIX. В стандарте POSIX опре­

деляются классы символов как еще одна сокращенная форма,
поддерживаемая во многих, хотя и не во всех реализациях

регулярных выражений. Эти классы перечислены в табл.

1

4.5.

Примечание
Применение классов символов

ниях не поддерживается в языке

Таблица

4.5.

Классы символов

Класс

Описание

[: alnum:]

Любая

цифра

POSIX в регулярных
JavaScript.

выраже­

POSIX

или

буква

(то

же,

что

и

[a-zA-Z0-9])
[ :alpha:]
[ :Ыank:]

Любая буква (то же, что и

[a-zA-Z])

Пробел или символ табуляции (то же, что и

[\t])
[: cntrl:]

Управляющие символы в коде

ASCII

[: digit:]
[ :graph:]
[: lower:]
[ :print:]
[ :punct:]

ASCII

(коды

от О до 31и127)

Любая цифра (то же, что и
То же, что и

[0-9])

[ : print: ] , кроме пробела

Любая строчная буква (то же, что и

[a-z])

Любой печатаемый символ

Любой символ, не относящийся ни к буквенно­
цифровым
символам

( [ : alnum: ] ),
( [: cntrl:])

ни к управляющим

Урок

58

4

Применение метасимволов

Окончание табл.

4.5

Класс

Описание

[ : space: ]

Любой

[ : upper: ]

Любая прописная буква (то же, что и [A-Z])

[ : xdiqi t: ]

Любая шестнадцатеричная цифра (то же, что и

пробельный

символ

(то

же,

что

и

[\f'\n\r\t\v])

[a-f'A-F0-9])
Синтаксис классов символов

POSIX

заметно отличает­

ся от рассматривавшегося до сих пор синтаксиса метасим­

волов. Чтобы

POSIX,

продемонстрировать применение

вернемся к примеру из урока

3,

классов

в котором регуляр­

ное выражение применялось для обнаружения значений
цвета

RGB

в блоке кода

HTML.

Текст

body {
background-color: #fefbd8;
)

hl
background-color: #OOOOff;
div
background-color:

#d0f4eб;

}

span {
background-color: #f08970;

Реrулярное выражение

# [ [ :xdigit:]] [ [ :xdigit:]] [ [ :xdigit:]] [ [ :xdigit:]]
[ [ :xdigit:]] [ [ :xdigit:]]
Результат

body {
background-color:

lfefЬdS;

59

Резюме

hl

background-color:

~;

background-color:

~;

span {
background-color:

tfD~U;

div

Анализ
В шаблоне, применявшемся в примере из урока
символов

[0-9A-Fa-f]

3,

набор

повторялся шесть раз подряд. Но в

шаблоне из данного примера он заменен классом символов

[ [ : xdi g i t : ] ] . А результат

получается такой же самый.

Примечание
Обратите внимание на то, что регулярное выражение, при­
меняемое в приведенном выше примере, начинается со зна­

ков

[[

и оканчивается знаками

]].

Это очень важное требо­

вание к применению классов символов
символов

POSIX

POSIX. Сами классы
[: и : ] , поэтому

заключены между знаками

в данном регулярном выражении такой класс обозначен как

[ : xdigi t: ] , а
] определяют

и

не как

: xdigi t:.

При этом внешние знаки

набор символов, а внутренние знаки

ляются частью самого класса символов

[

и

]

[

яв­

POSIX.

Предупреждение
Все двенадцать классов символов
табл.

4.5,

гулярных выражений, в которой

POSIX.

POSIX,

перечисленных в

обычно поддерживаются в любой реализации ре­
поддерживается стандарт

Но в их поддержке могут быть незначительные отличия

от описанного выше.

Резюме
Опираясь на основы организации совпадения симво­

лов и их наборов, рассмотренные в уроках

уроке были

представлены

2

и

3,

в этом

метасимволы, обозначающие

60

Урок

4

Применение метасимволов

совпадение с конкретными символами (например, со знака­

ми табуляции или перевода строки), целыми наборами или
классами символов (например, с цифрами или буквенно­

цифровыми символами). Сокращенные формы этих мета­
символов и классов символов

POSIX

могут быть использо­

ваны для упрощения шаблонов в регулярных выражениях.

Урок

5

Повторение
u

совпадении

Из предыдущих уроков вы узнали, как обнаруживать
совпадения с отдельными символами, используя различные

метасимволы и наборы специальных классов символов. А из
этого урока вы узнаете, как обнаруживать совпадения с не­
сколькими повторяющимися символами или их наборами.

Количество совпадений
Итак, вы изучили в предыдущих уроках все основы со­

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

требуется предпринять для написания регулярного выра­

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

text@text.text
Используя метасимволы, описанные в предыдущем уро­
ке, можно составить для этой цели регулярное выражение,

подобное следующему:

\w@\w\.\w

62

Урок

5

Повторение совпадений

Метасимвол обеспечит совпадение со всеми буквенно­
цифровыми символами, а также со знаком подчеркивания,
который вполне допустимо указывать в адресе электронной

почты. Знак

@экранировать
. -

в этом регулярном выражении

не нужно, тогда как знак

нужно.

Это регулярное выражение вполне допустимо, хотя и со­

вершенно бесполезно. Оно обеспечит совпадение с адресом
электронной почты наподобие а@Ь. с. И хотя такой адрес
синтаксически допустим, он, очевидно, недействителен.

Дело в том, что метасимвол
с

единственным

символом,

\w
но

обеспечивает совпадение
ведь

заранее

неизвестно,

сколько символов следует проверить на совпадение. Так,
все приведенные ниже адреса электронной почты действи­
тельны,

но

содержат

разное

количество

символов

перед

знаком@.

b@forta.com
ben@forta.com
bforta@forta.com
Следовательно, требуется каким-то образом обеспечить
совпадение с несколькими символами. И это можно сделать,
используя

один

из

рассматриваемых

далее

специальных

символов.

Совпадение с одним или несколькими символами
Чтобы обнаружить совпадение с одним или несколь­
кими экземплярами отдельного символа (или набора сим­
волов), достаточно присоединить к нему знак+. Этот знак
обозначает совпадение с одним или несколькими символа­

ми, т.е. хотя бы с одним символом, а иначе совпадение не

происходит. Так, если шаблон а обеспечивает совпадение с
буквой а, то шаблон а+

-

совпадение с одной или несколь­

кими буквами а. Аналогично шаблон

[ 0- 9]

обеспечивает

совпадение с любыми одиночными цифрами, тогда как ша­
блон (0-9]

+-

ряд цифрами.

с одной или несколькими следующими под­

63

Количество совпадений

Совет
Если знак

+

употребляется вместе с наборами символов, он

должен быть непременно указан за пределами набора. Сле­
довательно, шаблон

[О-9+]

-

[0-9] +составлен

правильно, а шаблон

неправильно. На самом деле шаблон

[0-9+]

яв­

ляется вполне допустимым регулярным выражением, но он не

обеспечивает совпадение с одной или несколькими цифра­
ми. Вместо этого он определяет набор символов от о до
знак

+,

9

или

а следовательно, обеспечивает совпадение с любой

одиночной цифрой или со знаком "плюс". И хотя это вполне
допустимо, но, вероятно, совсем не то, что нужно.

Вернемся к примеру с адресом электронной почты, но

на этот раз воспользуемся знаком

+,

чтобы обнаружить

совпадение с одним или несколькими символами, как по­
казано ниже.

Текст

Send personal email to ben@forta.com. For questions
about а book use support@forta.com. Feel free to send
unsolicited email to spam@forta.com (wouldn't it Ье
nice if it were that simple, huh?) . 1
Реrулярное выражение

\w+@\w+\.\w+
Результат

Send personal email to JМA@folta"~Celll. For questions
about а book use ~~t=i:~==lzi~~Feel f ree to send
unsolicited email to
(wouldn't it Ье
nice if it were that simple, huh?).

1

Отправляйте

личную

электронную

почту

по

адресу

ben@

forta.com. С вопросами по книге обращайтесь по
support@forta.com. А непрошеную электронную почту
не стесняясь,
отправлять по адресу spam@forta. сот

можете,

бьuю

.

бы замечательно,

если бы это было так просто!)

адресу


как

64

Урок

Повторение совпадений

5

Анализ
Шаблон, применяемый в данном примере, правильно об­
наружил совпадение со всеми тремя адресами электронной

почты. Сначала в регулярном выражении обнаруживается
совпадение с одним или несколькими символами по шабло­
ну

\w+,

затем

-

со знаком точки по шаблону\., а далее

с окончанием адреса по еще одному шаблону

1

-

\ w+.

Совет
Знак

+

является метасимволом. Чтобы обеспечить совпаде­

ние непосредственно со знаком "плюс", его необходимо экра­
нировать:

\+.

Используя метасимвол

+,

можно также организовать

совпадение с одним или несколькими наборами символов.
Чтобы продемонстрировать такую возможность, в следую­
щем примере показано применение того же самого регуляр­
ного выражения, но к немного другому исходному тексту.

Текст

Send personal email to ben@forta.com or
ben.forta@forta.com. For questions about а
book use support@forta.com. If your message
is urgent try ben@urgent.forta.com. Feel
free to send unsolicited email to
spam@forta.com (wouldn't it Ье nice if
it were that simple, huh?) . 2
Регулярное выражение

\w+@\w+\.\w+

2

Отправляйте

.r.ичную

э.r.ектронную

почту

по

адресу

Ьег.@

forta.com. С вопросами по книге обращайтесь по
support@!'orta. сот. А непрошеную электронную почту
не стесняясь,
отправ.r.ять по адресу spam@forta.com

w.ожете,

бьию бы замечательно,

.

если бы это было так просто!)

адресу


как

Количество совпадений

65

Результат

Send personal email to lllllJla!*~- or
ben.
For questions about

а

book use ~~-======·I~f~. your message
is urgent try
com. Feel
free to send
to
nice if
it were that
Анализ
В данном примере регулярное выражение обеспечило со­
впадение с пятью адресами, но с двумя из них не полностью.

Дело в том, что в шаблоне

\ w+@ \ w+ \ • \ w+

не предусмотрены

знаки точки перед знаком@, а после него допускается толь­

ко один знак точки, разделяющий две строки. И хотя адрес

ben. forta@forta. сот

вполне допустим для электронной

почты, данное регулярное выражение обеспечило совпаде­
ние только с доменом

скольку метасимвол

forta, а не с доменом ben. forta, по­
\ w обозначает совпадение с буквенно­

цифровыми символами, но не со знаком точки посредине
текстовой строки.

В данном случае требуется совпадение с метасимво­
лом

\w

или со знаком

ражений

-

., а

в терминологии регулярных вы­

с набором символов

[ \w\.]. Ниже приведен

правленный вариант предыдущего примера.

Текст

Send personal email to ben@forta.com or
ben.forta@forta.com. For questions about а
book use support@forta.com. If your message
is urgent try ben@urgent.forta.com. Feel
free to send unsolicited email to
spam@forta.com (wouldn't it Ье nice if
it were that simple, huh?).
Реrvлярное выражение

[\w.]+@[\w.]+\.\w+

ис­

66

Урок

5

Повторение совnадений

Результат

Send personal email to
or
For questions about

а

book
use ~~~~~~IJllli.II~f~""
message
is urgent
try
Feel
free to send unsolicited email to
(wouldn't it Ье nice if
were that simple, huh?) .
Анаnиз
Теперь цель, по-видимому, достигнута. В частности,

шаблон

[ \w.] +

совпадает с одним или несколькими эк­

земплярами любого буквенно-цифрового символа, знака
подчеркивания и знака точки, а следовательно, с доменом

ben. forta.

Этот же шаблон служит и для обнаружения

строки после знака@, а следовательно, и более глубоко вло­
женных имен доменов (или сетевых узлов, иначе называе­
мых хостами).

Примечание
Обратите внимание на то, что для совnадения с окончанием

адреса электронной nочты в регулярном выражении исnоль­
зован шаблон

\w+,

а не

[\w. J+.

Чтобы выяснить nричину

такого решения, nоnробуйте ввести шаблон

[\w. J

в конце

рассматриваемого здесь регулярного выражения. И тогда вы
увидите, что не так со вторым, третьим и четвертым совnаде­
ниями.

Примечание
Как видите, знак

.

в наборе

[ \w. J не был

экранирован, но он

все равно совnал со знаком точки, nоскольку был интерnрети­

рован буквально, а не как метасимвол. В общем, метасимво­
лы наnодобие

.

и

+ считаются

элементами обычного текста,

когда они уnотребляются в наборах символов, а следователь­
но, их не нужно экранировать. Тем не менее экранировать их

нисколько не nовредит. В частности, шаблон
нально равнозначен шаблону

[\w\. J.

[\w.] функцио­

Количество совпадений

67

Совпадение с нулевым или большим
количеством символов

Как пояснялось выше, метасимвол

обозначает совпа­

+

дение с одним или несколькими символами, т.е. хотя бы с
одним символом, а иначе совпадение не происходит. Но что

если требуется обнаружить совпадение с совершенно про­
извольным количеством символов: от нуля и больше?
Для этой цели служит метасимвол

*.

Он применяется

точно так же, как и метасимвол +,указывается после симво­

ла или набора символов и обозначает совпадение с нулевым
или большим количеством экземпляров символа или набо­
ра символов. Следовательно, шаблон В.*
совпадение с В

Forta,

В.

Forta обеспечит
Forta, Ben Forta и другими со­

четаниями имени и фамилии автора данной книги.

Чтобы продемонстрировать применение метасимвола

+,

рассмотрим следующий видоизмененный вариант примера
с адресом электронной почты.

Текст

Hello .ben@forta.com is my email address.
Реrvлярное выражение

[\w.)+@[\w.)+\.\w+
Результат

Hello

.J::ien!f~i:om

is my email address.

Анализ
Напомним, что шаблон

[ \ w. ] + обеспечивает совпадение

с одним или несколькими буквенно-цифровыми символами
и знаком точки, а следовательно, с доменом

. ben в приведен­

ном выше адресе электронной почты. Очевидно, в приведен­

ном выше адресе допущена опечатка (лишняя точка в самом

его начале), хотя это и не так важно. Важнее другое: несмо­
тря на то что знак

.

вполне допустим в адресе электронной

почты, его нельзя указывать в самом начале этого адреса.

Урок

68

5

Повторение совпадений

Иными словами, в данном случае требуется обеспечить
совпадение с буквенно-цифровым текстом, дополнительно
содержащим необязательные символы, как показано в сле­
дующем примере.

Текст

Hello .ben@forta.com is my email address.
Реrvлярное выражение

\w+[\w.]*@[\w.]+\.\w+
Результат

Hello

Иllf81fЬ:~~r'J~l8

is my email address.

Анализ
Приведенный выше шаблон выглядит несколько более
сложным. Впрочем, регулярные выражения нередко выгля­

дят намного более сложными, чем они есть на самом деле.
Итак, разберем данный шаблон по частям. Сначала шаблон

\w+ обеспечивает совпадение с любым буквенно-цифровым
символом, но не со знаком точки, т.е. с теми символами, с

которых разрешается начинать адрес электронной почты.
После первоначальных достоверных символов могут, конеч­
но, появиться знак точки и дополнительные символы, хотя

они могут и отсутствовать. А шаблон

[ \w.]

* обеспечива­

ет совпадение с нулевым или большим количеством экзем­
пляров знака точки или буквенно-цифровых символов, что,
собственно, и требуется.

Применение
Метасимвол

* можно

рассматривать как обозначающий не­

что необязательное. В отличие от метасимвола +,требующего

совпадения хотя бы с одним символом. метасимвол

* обеспе­

чивает любое количество совпадений, если таковые имеются.
хотя и не требует их наличия.

1

Количество совпадений

69

Совет
Знак

* является

метасимволом. Чтобы обеспечить совпаде­

ние непосредственно со знаком "звездочки", его необходимо

экранировать:

\

*.

Совпадение с нулевым или единичным
количеством символов

К числу весьма полезных относится метасимвол

добно метасимволу

+,

метасимвол

?

?.

По­

обозначает совпадение

с дополнительным текстом, а следовательно, будет обнару­
жено и нулевое количество совпавших экземпляров. Но, в

отличие от метасимвола

+,

метасимвол? обозначает совпа­

дение только нулевым или единичным количеством экзем­

пляров символа или набора символов, и не более того. Сле­

довательно, метасимвол

?

очень удобен для обнаружения

совпадений с конкретными одиночными дополнительными

символами в блоке текста.
Рассмотрим следующий пример.

Текст

The URL is http://www.forta.com/, to connect
securely use https://www.forta.com/ instead. 3
Реrvлярное выражение

http:\/\/[\w.\/]+
Результат

The URL is 11111118NIRlllll•• to connect
securely use
.сот/ instead.
Анализ
В данном примере для обнаружения совпадения с

применяется шаблон

3

http:

URL

\/\/,обозначающий обычный

URL - http://www.forta.com/, для безопасного подключе­
https://www.forta.com/.

ния воспользуйтесь адресом

Урок

70

5

Повторение совпадений

текст с двумя экранированными знаками косой черты, а

следовательно, он совпадает только с самим собой. Далее

следует шаблон

[\w. /] +,

обеспечивающий совпадение с

одним или несколькими экземплярами набора буквенно­

цифровых символов, знака точки и косой черты. Этот ша­
блон позволяет обнаружить совпадение только с первым

URL,
URL,

начинающимся с префикса
начинающимся с префикса

неверно употребить шаблон

s *,

ht tp: / /, но не совторым
https: //.Здесь было бы

обозначающий совпадение

с нулевым или большим количеством экземпляров буквы

s,

поскольку это позволило бы обнаружить совпадение и с

префиксом

httpsssss:

//,что совершенно неверно.

Как же разрешить данное затруднение? Для этого сле­

дует воспользоваться шаблоном

s?,

как демонстрируется в

следующем примере.

Текст

The URL is http://www.forta.com/, to connect
securely use https://www.forta.com/ instead.
Реrvлярное выражение

https?:\/\/(\w.\/J+
Результат
тhе

URL is
securely

11t:t8mr4"111fir,,fc~в-.!ll!I~·

to connect
instead.

Анализ
В данном примере регулярное выражение начинается с

шаблона

https?: / /.,

где знак

?

обозначает, что предше­

ствующий ему символ (в данном случае

-

буква

s)

должен

совпасть как в том случае, если он отсутствует, так и в том

случае, если присутствует его единичный экземпляр. Ины­

ми словами, шаблон
как с префиксом
и только.

https?: / / обеспечивает совпадение
http: //,так и с префиксом https: //,но

Количество совпадений

Между прочим, употребление метасимвола
ет разрешить затруднение, упоминавшееся

71

? позволя­

в предыдущем

уроке, в котором рассматривался пример применения ша­

блона

\r\n

для обнаружения совпадения с маркером конца

линии. Как пояснялось тогда, на платформе

Unix

или

Linux

для этой цели необходимо пользоваться шаблоном, состоя щим только из метасимвола

\n.

А в идеальном регулярном

выражении, вероятно, должны быть учтены оба варианта

обозначения конца строки: необязательный метасимвол
и обязательный метасимвол

\n.

\r

Данный пример снова при­

водится ниже, но на этот раз с несколько видоизмененным

регулярным выражением для обнаружения маркера конца
строки.

Текст

"101","Ben","Forta"
"102","Jim","James"
"103","Roberta","Robertson"
"104","Bob","Bobson"
Реrvлярное выражение

[\r)?\n[\r)?\n
Результат

"101","Ben","Forta"
"102","Jim","James"
"103","Roberta","Robertson"
"104", "ВоЬ", "Bobson"
Анализ

Шаблон

[ \r] ? \n

обеспечивает совпадение с дополни­

тельным экземпляром метасимвола
тасимволом

\n.

\r

и обязательным ме­

Урок

72

5

Повторение совпадений

Совет
Как видите. в регулярном выражении из данного примера

вместо шаблона

использован шаблон

\r?. [\r]

[\r] ?,

в

котором определяется набор, состоящий из единственного
метасимвола, т.е. единичный набор. Таким образом, шаблон

функционально равнозначен шаблону

[\r]?

\r?.

Знаки [и]

обычно применяются для определения набора символов, хотя
некоторые разработчики предпочитают заключать в них даже

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

? . то

набора. Из этого следует, что шаблон

верно. а шаблон

1

[

и

]

вместе с метасим­

? за пределами
http [s]?: //составлен

непременно укажите метасимвол

http [s?] : // -

неверно.

Совет
Знак

?

является метасимволом. Чтобы обеспечить совпаде­

ние непосредственно с вопросительным знаком, его необхо­

димо экранировать:\?.

Применение интервалов
Метасимволы

+,

* и ? служат для решения многих задач

с помощью регулярных выражений, но иногда их оказыва­

ется недостаточно. Применяя эти метасимволы, необходи­
мо принимать во внимание следующее.



Метасимволы

+

и

*

обеспечивают совпадение с не­

ограниченным количеством символов. Они не позво­

ляют никоим образом задать максимальное количес­
тво совпадающих символов.



Метасимволы

+,

*

и

?

поддерживают лишь мини­

мальные количества совпадающих символов: нулевое

и единичное. Они не позволяют никоим образом за­
дать вручную минимальное количество совпадений.



Кроме того, нельзя никоим образом задать требую­
щееся количество совпадений.

Применение интервалов

73

Чтобы преодолеть перечисленные выше ограничения и

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

применять интервалы, которые обычно заключаются в фи­
гурные скобки

{ и }.

Примечание
Знаки

1

и

{

}

сами являются метасимволами, а следовательно,

они должны быть экранированы знаком

\,

чтобы использо­

вать их как буквальный текст. Следует, однако. иметь в виду,
что

{

и

во

}

многих реализациях

регулярных выражений

знаки

интерпретируются должным образом, даже если они не

экранированы, т.е. такие реализации достаточно развиты ло­

гически, чтобы различить, когда эти знаки употребляются как

таковые, а когда

-

как метасимволы. Тем не менее на такое

поведение лучше не полагаться, экранировав знаки

{

и

} , ког­

да их требуется употребить буквально.

Совпадение с конкретным интервалом символов
Чтобы указать конкретное количество совпадений, до­

статочно заключить соответствующее число в фигурные
скобки

{

и

}.

Так, шаблон

{ 3}

обозначает три совпадения

предыдущего символа или набора символов. Если же совпа­

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

RGB,

рассматривавшемуся в уроках

что значения цвета

RGB

3 и 4.

Напомним,

обозначаются тремя рядами шест­

надцатеричных чисел, каждое из которых состоит из двух

символов. Первый шаблон, применявшийся для сопоставле­

ния со значением цвета

RGB,

выглядел следующим образом:

# [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f] [0-9A-Fa-f]
[0-9A-Fa-f]
[0-9A-Fa-f]

74

Урок

5

Повторение совпадений

В уроке
символов

4 этот шаблон был изменен
POSIX таким образом:

с помощью класса

# [ [ :xdigit:]] [ [ :xdigit:]] [ [ :xdigit:)] [ [ :xdigit:])
[ [ :xdigit:)] [ [ :xdigit:] J
Недостаток обоих приведенных выше шаблонов заклю­
чается в том, что конкретный набор (или класс) символов
приходится повторять в них шесть раз подряд. Ниже приве­
ден тот же самый пример, но на этот раз в нем применяется
совпадение с конкретным интервалом символов.

Текст

body {
background-color: #fefbdB;
}

hl
background-color: #OOOOff;
div
background-color: #d0f4e6;
}

span {
background-color: #f08970;

Реrvлярное выражение

#[A-Fa-f0-9) {6}
Результат

body {
background-color:

llвc~;

}

hl
background-color:

~tf;

div
background-color: f(t0ffe6;
span {
background-color: t.f089'10;

Применение интервалов

75

Анализ
В данном примере шаблон

[A-Fa-f0-9] совпадает с

единственной шестнадцатеричной цифрой, а шаблон

{ 6}

повторяет это совпадение шесть раз. Этот последний ша­

блон вполне пригоден и для применения вместе с классами
символов

POSIX.

Совпадение с интервалом символов
в заданных пределах

Интервалы могут быть использованы и для указания
конкретного диапазона значений: от минимального до мак­
симального количества совпадающих экземпляров. Диапа­

зоны задаются следующим образом:
минимум два совпадения, а

4-

{2, 4 },

где

2

означает

максимум четыре совпаде­

ния предыдущего символа или набора символов. В приве­
денном ниже примере демонстрируется регулярное выра­

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

Текст

4/8/17
10-6-2018
2/212

01-01-01
Регулярное выражение

\d {1, 2) [ -\ /] \d {1, 2) [ -\ /] \d {2, 4)
Результат

21212

76

Урок

Повторение совпадений

5

Анализ
Даты, перечисленные в данном примере, могут быть вве­

дены пользователями в поле формы, а следовательно, они
должны быть проверены на правильность их соответствия

принятому формату дат. В частности, шаблон

\d {1, 2}

обеспечивает совпадение с одной или двумя цифрами, что
удобно для проверки достоверности указанного дня или ме­
сяца. Шаблон

\ d {2, 4 } обеспечивает совпадение с указан­
[ - \ /] - совпадение со знаком - или

ным годом, а шаблон
же со знаком

/

в качестве разделителя дат. В итоге совпаде­

ние в данном примере было обнаружено с тремя датами, но
не с датой

2/2/2,

которая не совпала, поскольку год указан

в ней слишком коротким.

Совет
В регулярном выражении из данного примера знак

/

экрани­

рован:\/. И хотя во многих реализациях регулярных выраже­
ний этого не требуется, тем не менее в некоторых синтаксичес­
ких анализаторах регулярных выражений такое экранирова­

ние считается непременным условием. Поэтому экранировать
подобные знаки всегда уместно.

Следует, однако, иметь в виду, что шаблон из приве­
денного выше примера не проверяет сами даты на досто­

верность. Например, такие даты, как

54/67 /9999,

вполне

пройдут проверку по данному шаблону. Ведь этот шаблон
проверяет лишь достоверность формата дат, что обычно де­
лается перед проверкой достоверности самих дат.

Примечание
Интервалы могут начинаться с нуля. Так, интервал (о, з} обо­
значает от нуля до трех совпадений. Как пояснялось ранее,
метасимвол

?

обозначает нулевое или единичное количество

совпадений предыдущего символа или набора символов. Сле­
довательно, метасимвол
тервалу (о

, 1}.

?

функционально равнозначен ин­

Применение интервалов

77

Совпадение хотя бы с заданным интервалом символов
И наконец, интервалы можно применять для указания
минимального количества совпадающих экземпляров сим­

волов вообще без максимального их количества. Синтаксис
такого рода интервала такой же, как и у диапазона, но в нем

опущен максимальный предел. Например, шаблон

{3, }

обозначает совпадение хотя бы с тремя экземплярами, ины­

ми словами

-

с тремя или больше экземплярами символов.

Рассмотрим пример, демонстрирующий все, что поясня­

лось до сих пор в этом уроке. Регулярное выражение приме­

няется в данном примере для обнаружения всех заказов на
сумму от

100 и больше долларов

США.

Текст

1001:
1002:
1003:
1004:
1005:
1006:
1007:

$496.80
$1290.69
$26.43
$613.42
$7.61
$414.90
$25.00

Реrулярное выражение

\d+: \$\d{3, )\. \d{2)
Результат

1003: $26.43
1005: $7. 61
1007: $25.00
Анализ
В исходном тексте из данного примера приведен от­
чет с суммами заказов, упорядоченных по номеру заказа.

Урок

78

5

Повторение совпадений

В регулярном выражении из данного примера сначала при­

меняется шаблон

\d+:,

обеспечивающий совпадение с по­

рядковым номером заказа (если опустить этот шаблон, то с
данным регулярным выражением сопоставлялась бы только
сумма заказов, а не вся строка заказа в целом, включая и его

номер). Шаблон

\ $ \ d {3, ) \ . \ d {2 )

ние с самой суммой заказа, где

d {3, ) -

\$

обеспечивает совпаде­
совпадает со знаком

$,

с числами, состоящими хотя бы из трех цифр, а

следовательно, с суммой не меньше

с десятичной точкой, а

\ d {2 ) -

100 долларов США, . -

с двумя цифрами после де­

сятичной точки. В итоге регулярное выражение из данного

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

Совет
Применяя данную форму интервалов, будьте внимательны. До­
статочно опустить в ней запятую

(, ),

чтобы проверка изменила

свое назначение с минимального на конкретное количество

совпадений.

1

Примечание

Метасимвол +функционально равнозначен интервалу

{ 1, } .

Предотвращение лишних совпадений
Метасимвол

? обозначает ограниченное (нулевое или

единичное) количество совпадений. То же самое относит­
ся и к интервалам, когда в них указываются конкретные

величины или диапазоны. Но другие формы повторения,
описанные в этом уроке, допускают неограниченное ко­

личество совпадений, которое иногда оказывается чрез­
мерным.

Все представленные до сих пор примеры были тща­
тельно подобраны, чтобы избежать чрезмерных совпаде­
ний. Рассмотрим, однако, следующий пример текста с веб­
страницы, содержащего встроенные дескрипторы раз­

метки в формате

HTML. В регулярном выражении требуется

Предотвращение лишних совпадений

79

обнаружить совпадение с любым текстом, заключенным в

дескрипторы , возможно, с целью заменить форматиро­
вание, как показано ниже.

Текст

This of f er is not availaЫe to customers
living in АК and HI. 4
Реrvлярное выражение
.*

Результат

This offer is not availaЫe to customers
living in ~-~~:~i.М;i, где буква Ь

может быть как прописной, так и строчной. Но вместо двух
отдельных совпадений в данном случае было обнаружено
лишь единственное общее совпадение. В частности, шаблон

. * обеспечил

совпадение с любыми символами после пер­

вого дескриптора и вплоть до последнего дескриптора

< /Ь>,

а следовательно, было обнаружено совпадение с фраг­

ментом разметки АК

and HI

, включая не

только текст, который требовалось найти, но и экземпляры
других дескрипторов.

Дело в том, что метасимволы

*, .

и

+ жадны,

т.е. обна­

руживают максимально, а не минимально возможное сов­

падение. В итоге обнаружение совпадения почти всегда
начинается не с начала, а с конца текста и продолжается в

обратном направлении до тех пор, пока совпадение не будет

4

Это

предложение

Аляске и Гавайях.

недоступно

клиентам,

проживающим

на

Урок

80

5

Повторение совпадений

найдено. Это делается преднамеренно, и поэтому подобные
кванторы по своему замыслу жадны.

Но что если жадное совпадение не требуется! В та­
ком случае можно воспользоваться ленивыми вариантами

упомянутых выше кванторов. Они называются ленивыми

потому, что обозначают совпадение с минимальным, а не
максимальным количеством символов. Ленивые кванторы

обозначаются с присоединяемым к ним знаком

?. У

каждо­

го жадного квантора имеется свой ленивый эквивалент, как

следует из табл.
Таблица

5.1.

5.1. Жадные

и ленивые кванторы

Жадный квантор

Ленивый квантор

+

*

*?
+?

{n,}

{n, }?

А теперь вернем к предыдущему примеру, заменив мета­
символ *как слишком жадный квантор его ленивым вари­
антом

*?

в регулярном выражении, как показано ниже.

Текст

This off er is not availaЬle to customers
living in АК and HI.
Реrvлярное выражение
.*?

Результат

This offer is not availaЫe to customers
living in ~- and _ _ . .
Анализ
Теперь цель достигнута. Благодаря ленивому квантору

*?

в данном случае удалось обнаружить сначала первое

Резюме

81

совпадение с фрагментом разметки АК, а затем вто­
рое совпадение с фрагментом разметки НI незави­
симо от первого совпадения.

Примечание
В большинстве примеров из данной книги употребляются жад­
ные кванторы, чтобы сделать шаблоны как можно более прос­

тыми. Но вы вольны заменить их ленивыми кванторами по
мере надобности.

Резюме
Истинный потенциал регулярных выражений раскрыва­

ется в обращении с повторяющимися совпадениями. В этом
уроке были представлены метасимволы

+

(обозначает сов­

падение с единичным или большим количеством символов),

* (обозначает совпадение с нулевым или
ством символов),

большим количе­

? (обозначает совпадение с нулевым или

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

совпадений. Упомянутые выше метасимволы являются жад­
ными

кванторами, а следовательно, их применение может

привести к обнаружению лишних совпадений. Чтобы избе­
жать этого, рекомендуется пользоваться ленивыми аналога­
ми этих кванторов.

Урок

6

Совпадение позиций
Из предыдущих уроков вы узнали, как обнаруживать
совпадения с самыми разными символами в различных со­

четаниях, повторениях и в любых местах текста. Но иногда
требуется обнаружить совпадение в конкретных местах из

блока текста, а для данной цели потребуется совпадение по­
зиций, поясняемое в этом уроке.

Назначение границ
Совпадение позиций служит для обозначения в тексто­
вой строке того места, где должно произойти совпадение.

Что бы стала понятнее потребность в совпадении позиций,
рассмотрим следующий пример.

Текст

The cat scattered his food all over the room. 1
Регулярное выражение

cat
Результат

The cat scattered his food all over the room.

1

Кот разбросал свою еду по всей комнате.

Урок

84

Совпадение позиций

6

Анализ
Шаблон са t обеспечивает совпадение со всеми вхожде­
ниями слова

s са t t е red.

cat,

даже если это слово содержится в слове

И хотя это может иногда дать желаемый резуль­

тат, чаще всего добиться его не удается. Так, если произвести
поиск Для замены всех вхождений слова

cat

словом

dog,

то

в конечном счете будет получена следующая бессмыслица:

The dog sdogtered his food all over the room.
Этот результат приводит к понятию границ или специ­

альных метасимволов, обозначающих позицию (т.е. грани­
цу) до или после шаблона.

Определение границ слова
Первая (и наиболее употребительная) граница пред­

ставляет собой границу слова, обозначаемую как \Ь. Как
подразумевает название метасимвола \Ь, он служит для

обозначения совпадения с началом или концом слова. Что­
бы продемонстрировать применение метасимвола \Ь, об­
ратимся снова к предыдущему примеру, задав на этот раз
границы слова.

Текст

The cat scattered his food all over the room.
Реrvлярное выражение

\bcat\b
Результат

The cat scattered his food all over the room.
Анализ
Слово са t

отделяется в данном примере пробелами

от друrих слов и поэтому совпадает с шаблоном

\bcat \Ь

Определение границ слова

85

(пробел относится к числу символов, применяемых для раз­
деления слов). Но в слове

scattered совпадение

со словом

по данному шаблону не обнаружено, поскольку ему

cat

предшествует буква

буква t (ни та, ни дру­

s, а после него -

гая не совпадает с метасимволом \Ь).
Примечание
Так с чем же конкретно совпадает метасимвол \Ь? Механиз­

1

мы обработки регулярных выражений не понимают ни англий­

ского, ни любого другого языка, и поэтому им неизвестны кон­

кретные границы слов. Метасимвол \Ь просто обеспечивает

совпадение с местоположением в промежутке между симво­

лами, которые обычно являются частями слов (буквенно-циф­
ровыми

символами

и

знаком

подчеркивания,

который будет совпадать с метасимволом

\w)

т.е.

текстом,

и чем-то другим

(текстом, который будет совпадать с метасимволом

\W).

В связи с изложенным выше очень важно понять, что для

совпадения с целым словом метасимвол \Ь должен быть ис­
пользован как до, так и после текста, совпадение с которым

требуется обнаружить. Рассмотрим следующий пример.
Текст

The captain wore his сар and саре proudly as
he sat listening to the recap of how his
crew saved the men from а capsized vessel. 2
Реrvлярное выражение
\Ьсар

Результат

The Ciiptain wore his ·,р and саре proudly as
he sat listening to the recap of how his
crew saved the men from а 'c;:sized vessel.
2

Капитан гордо восседал в кепке и плаще,

изложение

рассказа

опрокинутого

судна.

о

том,

как

его

команда

слушая краткое
спасла

людей

с

Урок

86

6

Совпадение позиций

Анализ
Шаблон \Ьсар обеспечивает совпадение с любым сло­
вом, начинающимся

на сар, и поэтому в данном примере

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

Ниже приведен тот же самый пример, но только с мета­
символом \Ь в конце регулярного выражения.

Текст

The captain wore his сар and саре proudly as
he sat listening to the recap of how his
crew saved the men from а capsized vessel.
Реrулярное выражение
сар\Ь

Результат

The captain wore his . . . and саре proudly as
he sat listening to the re11AD of how his
crew saved the men from а capsized vessel.
Анализ
Шаблон сар \Ь обеспечивает совпадение с любым сло­
вом, оканчивающимся на сар, и поэтому в данном примере

обнаружены два совпадения: одно
гое

-

-

само слово сар, а дру­

не являющееся этим словом.

Если же требуется обнаружить совпадение только со
словом сар, для этой цели следует воспользоваться шабло­

ном \Ьсар \Ь.
Примечание
Метасимвол \Ь обеспечивает совпадение не с конкретным
символом, а с определенной позицией. Таким образом, сим­
вольная строка, совпадающая с шаблоном
стоять из трех символов (с, а и

t),

\bcat\b,

будет со­

а не из пяти символов.

Определение границ слова

87

Чтобы исключить совпадение на границе слова, следует
воспользоваться метасимволом \В. В приведенном выше

примере метасимволы \В применяются для того, чтобы об­
наружить знаки дефиса с дополнительными пробелами во­
круг них.

Текст

Please enter the nine-digit id as it
appears on your color - coded pass-key. 3
Регулярное выражение
\В-\В

Результат

Please enter the nine-digit id as it
appears on your color - coded pass-key.
Анализ
Шаблон

\В- \В обеспечивает совпадение с дефисом,

окруженным знаками разрыва слов. Если совпадения с де­

nine-digi t и passkey не происходит, то оно обнаруживается в словосочета­

фисами по данному шаблону в словах
нии

color - coded.

Примечание

1

Если приведенная выше строка кода вам пока еще непонятна,

не отчаивайтесь. Вскоре вы поймете ее назначение.

1

Примечание
В некоторых реализациях регулярных выражений поддержи­
ваются два дополнительных метасимвола. Если метасимвол

\Ь обозначает совпадение с началом или концом слова, то
метасимвол \-

Введите, пожалуйста, идентификатор uвета из девяти цифр,

обозначенный на

вашем ключе доступа

с uветовой кодировкой.

Урок

88

1

Совпадение позиций

6

только с концо~ слова. И хотя эти метасимволы обеспечивают
дополнительныи контроль, их поддержка весьма ограничена:
они

поддерживаются в утилите

eqrep,

в отличие от многих

других реализаций регулярных выражений.

Определение границ символьных строк
Границы слов служат для обнаружения совпадений, ис­
ходя из их позиций в слове (начало слова, конец слова, все
слово и т.д.). Аналогичную функцию выполняют границы
символьных строк, но они служат для сопоставления с ша­

блонами в начале или в конце целой строки. Для обозначе­
ния границ символьных строк служат следующие метасим­

волы:

" -

в начале строки, а

$-

в конце строки.

Пример
Из урока

3

вы узнали, что метасимвол "служит для того, чтобы

обозначить отрицание набора символов. Как же в таком слу­
чае воспользоваться им, чтобы обозначить начало символь­

ной строки?

Метасимвол

"

относится к числу тех нескольких метасимво­

лов, которые имеют не одно назначение. Этот метасимвол
обозначает отрицание набора символов только в том случае,

],

он

указан первым после открывающей квадратной скобки

если в наборе, заключаемом в квадратные скобки

[.

А если метасимвол

"

[

и

указан за пределами набора символов

и в начале шаблона, то он обозначает совпадение с началом

символьной строки.

Чтобы продемонстрировать применение границ сим­
вольных строк, рассмотрим следующий пример. Достовер­

ные ХМL-документы начинаются с дескриптора разметки

,

в котором, вероятнее всего, имеются дополнитель­

ные атрибуты (например, номер версии в дескрипторе

version="l. О"

).Ниже приведена простая проверка на

соответствие исходного текста формату ХМL-документа.

Определение границ символьных строк

89

Текст


. *

было обнаружено совпадение с первым заголовком, за­
ключенным между дескрипторами разметки



и

.

Кроме того, может быть обнаружено совпадение с дескрип­
тором разметки

,

поскольку в формате

HTML

регистр

букв не учитывается. Но какой шаблон потребуется, чтобы
обнаружить совпадение с любым заголовком, расположен­
ным на одном из шести допустимых уровней? Одно из воз­
можных решений этой задачи может состоять в примене­
нии простого диапазона вместо

1

1,

как показано ниже.


Добро пожаловать

на мою начальную страницу

Ее содержимое разделено

на два раздела:

SQL
Сведения

об

языке

SQL.

RegEx
Сведения



о

регулярных

выражениях.

Общее представление об обратных ссылках

109

Текст


Welcome to my Homepage
Content is divided into two sections:
SQL
Information about SQL.
RegEx
Information about Regular Expressions.

Регулярное выражение

.*?
Результат

-

Content is divided into two sections:
I nformation about SQL.

Information about Regular Expressions.


Анализ
Цель, по-видимому, достигнута. Шаблон

< [hH] [ 1- 6] >

обеспечивает совпадение с начальным дескриптором раз­

метки любого заголовка (в данном случае
а шаблон

-

-

и

),

с конечным дескриптором раз­

метки любого заголовка (в данном случае-

и ).

Примечание
Обратите внимание на то, что в данном примере был приме­

нен ленивый квантор
блоне

. *?.

*?

вместо жадного квантора

Как пояснялось в уроке

5,

*

в ша­

такие кванторы, как

являются жадными, а следовательно. по шаблону< [hИ]

*,

[1-

6] >. *могло быть обнаружено все содержи­
во

мое, начиная с открывающего дескриптора разметки

второй строке и заканчивая закрывающим дескриптором раз

110

Урок

метки

Применение обратных ссылок

8



в шестой строке. Этого недостатка удалось из­

бежать благодаря применению ленивого квантора

* в шабло­

не.*?.

Упомянутое выше излишнее совпадение могло, но не должно

было быть обнаружено, поскольку в данном конкретном при­
мере регулярное выражение, вероятно, оказалось бы вполне

работоспособным и с жадным квантором. Как правило, ме­
тасимвол

.

не обозначает совпадение с разрывами строк, а

в данном примере каждый заголовок находится в отдельной
строке. Но в применении здесь ленивого квантора нет ничего
плохого, поскольку лучше перестраховаться на всякий пожар­
ный случай.

Итак, цель в данном примере можно считать достигну­

той? Не совсем. Чтобы убедиться в этом, рассмотрим сле­
дующий пример с тем же самым регулярным выражением.

Текст


Welcome to my Homepage
Content is divided into two sections:
SQL
Information about SQL.
RegEx
Information about Regular Expressions.
This is not valid HTML 2

Реrулярное выражение

< [hH] [l-6] >. *?
Результат

..•

."

Content is divided into two sections:
Information about SQL.
2

Это неверная НТМL-разметка

Совпадение с обратными ссылками

111

---*'~'

Inf ormation about

Анализ
Разметка последнего заголовка начинается с дескриптора



и заканчивается дескриптором , а следователь­

но, она неверна. Тем не менее она совпала с применяемым в

данном примере шаблоном.

Дело в том, что вторая часть шаблона, в которой осущест­
вляется сопоставление с конечным дескриптором разметки,

никак не связана с первой его частью, в которой осущест­
вляется сопоставление с начальным дескриптором размет­

ки. Именно здесь и приходят на помощь обратные ссылки.

Совпадение с обратными ссылками
Мы еще вернемся к упомянутому выше недостатку об­
наружения заголовков на веб-странице. А пока рассмотрим

более простой пример, в котором нельзя никак разрешить
возникающий недостаток без применения обратных ссылок.
Допустим, что имеется блок текста и требуется обнару­

жить все повторяющиеся слова (опечатки, где одно и то же
слово ошибочно набрано дважды). Очевидно, что при обна­

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

-

к совпавшему ранее слову).

Пояснить механизм действия обратных ссылок лучше
всего на конкретном примере, поэтому ниже приведен ис­

ходный текст, содержащий три ряда повторяющихся слов,

все из которых требуется обнаружить.

Текст

This is а Ыосk of of text,
several words here are are

112

Урок

8

Применение обратных ссылок

repeated, and and they
should not Ье. 3
Реrулярное выражение

[ ] + ( \ w+) [ ] + \ 1
Результат

text,
This is а Ыосk
several words here
repeated,
they
should not Ье.
Анализ
Очевидно, что регулярное выражение в данном приме­

ре сработало исправно, но как? Шаблон

[ ] + обеспечивает
\ w+ -

совпадение с одним или больше пробелами, шаблон

с одним или больше буквенно-цифровыми символами, а
шаблон

[ ]+-

с завершающими пробелами. Но обратите

внимание на то, что шаблон

\ w+ заключен в круглые скобки,

а следовательно, превращен в подвыражение. Это подвыра­

жение служит не для обнаружения повторяющихся совпа­
дений, поскольку такие совпадения в данном примере от­
сутствуют, а просто для группирования выражения с целью

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

обратная ссылка

\1,

обеспечивающая совпадение с тем же

самым текстом, что и в первой совпавшей группе. Так, если

подвыражение

обнаружит совпадение со словом

( \w+)

то оно будет обнаружено и по обратной ссылке
подвыражение

( \ w+)

3

Это блок текста,
повторяются,

хотя

в котором несколько слов
и не должны повторяться.

of,

А если

обнаружит совпадение со словом

то оно будет обнаружено и по обратной ссылке

and)

\1.

and,

\ 1.

(of,

are и

Совпадение с обратными ссылками

1

113

Примечание

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

Что же конкретно обозначает обратная ссылка \Н Она
обозначает совпадение с первым подвыражением в ша­
блоне, обратная ссылка

совпадение со вторым под­

\2 -

выражением, обратная ссылка

\3-

совпадение с третьим

подвыражением и т.д. Таким образом, шаблон

[ ] +\ 1 обеспечивает

[ ] + ( \ w+)

совпадение сначала с любым словом,

а затем с тем же самым словом снова, что и было продемон­
стрировано в приведенном выше примере.

Предупреждение
К сожалению, синтаксис обратных ссылок заметно отлича­
ется в разных реализациях регулярных выражений. Так. в

JavaScript,

как. впрочем. и в текстовом редакторе

vi,

знак

\

служит для обозначения обратной ссылки, за исключением
операций замены, в которых применяется знак

Perl

\1

для этой же цели применяется знак

$,

$.

А в языке

и поэтому вместо

обратная ссылка на первое выражение в шаблоне обо­

значается как

$1.

На платформе

.NET

регулярные выражения

поддерживаются таким образом, чтобы возвращать объект со
свойством

Groups,

содержащим обнаруженные совпадения,

и поэтому обратная ссылка

делается на

match. Groups [1]

первое совпадение, обнаруженное на языке С#, а обратная
ссылка

match. Groups (1) -

наруженное на языке

РНР возвращается в массиве
ссылка

$matches [1]

на то же самое совпадение, об­

Visual Basic. Аналогичная

информация в

$matches, и поэтому обратная

делается на первое обнаруженное со­

впадение, хотя такое поведение можно изменить, установив

соответствующие признаки. И наконец, в

Java

и

Python

вращается объект совпадения, содержащий массив

воз­

qroup.

Особенности отдельных реализаций регулярных выражений
перечислены в приложении к данной книге.

1

Совет
Обратные ссылки можно рассматривать как подобные пере­
менным.

114

Урок

8

Применение обратных ссылок

Итак, рассмотрев особенности применения обратных

ссылок, вернемся снова к примеру с заголовками в формате

HTML.

Используя обратные ссылки, можно составить ша­

блон, обеспечивающий совпадение с любым начальным и
конечным

дескрипторами

разметки

заголовка,

игнорируя

любые пары несовпадений, как демонстрируется в приве­
денном ниже примере.

Текст


Welcome to my Homepage
Content is divided into two sections:
SQL
Information about SQL.
RegEx
Information about Regular Expressions.
This is not valid HTML

Реrvлярное выражение

< [hH] ( [1-6]) >. *?
Результат

~~~

. . . . . . . . . .:111111•

•11•••-

Content is divided into two sections:

---

Information about SQL.

Information about Regular Expressions.
This is not valid HTML


Анализ
И в данном примере обнаружены три совпадения: од­
но

-

с парой дескрипторов разметки

дескрипторов разметки

( [ 1- 6] ) >

.

и два -

с парами

Как и прежде, шаблон<

[hH]

обеспечивает совпадение с любым начальным

Совпадение с обратными ссылками

115

дескриптором разметки заголовка. Но, в отличие от преж­

него, интервал

[ 1- 6]

заключен в круглые скобки, а следова­

тельно, он превращен в подвыражение. Таким образом, ша­
блон для сопоставления с конечным дескриптором размет­
ки заголовка может ссылаться на данное подвыражение, как

это делается по обратной ссылке

\1 в шаблоне.
( [1- 6] ) обеспечивает совпадение
обратная ссылка \ 1 - только с той

При этом подвыражение
с цифрами от

1

до

6,

а

же самой цифрой. Именно поэтому в данном примере и не
было обнаружено совпадение с неверной разметкой заго­
ловка

This is not valid

HTML.

Предупреждение

1
1

Обратные ссылки будут действовать только в том случае. если
они делаются на подвыражение. заключенное в круглые скоб­
ки.

Совет

Совпадения обычно обозначаются, начиная с

1.

Но во многих

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

Примечание
Как было показано в приведенных выше примерах, обратные
ссылки на подвыражения делаются по их относительным по­

зициям:

\1 -

на первое подвыражение,

\5 -

на пятое под­

выражение и т.д. И хотя такой синтаксис обратных ссылок на­

ходит всеобщую поддержку, ему присущ следующий серьезный
недостаток: переместив или поправив подвыражения, а сле­
довательно, изменив их порядок расположения, можно в ко­

нечном счете нарушить весь шаблон. Еще труднее вводить и
удалять подвыражения.

Для устранения подобного недостатка в ряде новых реализа­
ций регулярных выражений
захват

-

поддерживается именованный

средство, позволяющее присвоить каждому подвы­

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

ции в шаблоне. Именованный захват в данной книге не рас­
сматривается потому, что он по-прежнему не находит широкой

116

Урок

8

Применение обратных ссылок

поддержки, а его синтаксис заметно отличается в тех реали­

зациях регулярных выражений, в которых он поддерживается.
Но если в той реализации, которой вы пользуетесь, именован­
ный захват поддерживается (например, на платформе

.NET),

непременно воспользуйтесь преимуществами его функцио­

нальных возможностей.

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

кретного текста в более крупном блоке текста. Разумеется,

большинство регулярных выражений пишутся именно для
целей поиска нужного текста. Но этим применение регу­
лярных выражений не отграничивается. Их можно исполь­

зовать и для выполнения эффективных операций замены
текста.

Для простой замены текста регулярные выражения не

требуются. Они, например, не нужны для того, чтобы за­
менить все экземпляры сокращения СА названием штата

California
такую

или

операцию

MI

названием штата

вполне

допустимо

Michigan.

реализовать

И хотя
с

помо­

щью регулярного выражения, ее ценность сомнительна, а

на самом деле проще и быстрее воспользоваться для той же
самой цели имеющимися в наличии обычными функциями
манипулирования символьными строками.

Операции замены с помощью регулярных выражений
стали привлекательными

с тех пор,

когда появилась

воз­

можность пользоваться обратными ссылками. Обратимся
снова к примеру из урока

5.

Текст

Hello, ben@forta.com is my email address.
Реrvлярное выражение

\w+[\w\.]*@[\w\.]+\.\w+

Выполнение операций замены

117

Результат

IJlllllJBlllJI is

Hello,

my email address.

Анализ
По шаблону из данного примера в блоке исходного тек­
ста обнаруживаются адреса электронной почты, как пояс­
нялось в уроке

5.

Но что если требуется

сделать любые адреса элек­

тронной почты доступными по гиперссылке? В форма­
те

HTML можно, например, воспользоваться разметкой
href="mailto:user@address.com">user@address.
com, чтобы создать адрес электронной почты, активи­

) (. *?) ()
Замена

$1\U$2\E$3
Результат

Content is divided into two sections:
SQL
Information about SQL.
RegEx
Information about Regular Expressions.
This is not valid HTML

Анализ
Первый шаблон

(< [Hh] 1>) (. *?) ()

в дан­

ном примере разбит на три подвыражения для сопоставле­

ния с заголовком и последовательного обнаружения откры­
вающего дескриптора разметки, текста заголовка и закрыва­

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

шаблон

$1 содержит начальный дескриптор разметки,
\U$2\E приводит результат совпадения со вторым

подвыражением в первом шаблоне (т.е. текст заголовка) к
верхнему регистру букв, а переменная
ный дескриптор разметки.

$3

содержит конеч­

122

Урок

8

Применение обратных ссылок

Резюме
Подвыражения служат для определения наборов симво­
лов или выражений. Они не только применяются для обна­
ружения повторяющихся совпадений, как демонстрирова­

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

циях регулярных выражений заметно различается. Обрат­
ные ссылки удобны для применения в операциях совпаде­
ния и замены текста.

Урок

9

Просмотр вперед
и назад

Все рассматривавшиеся до сих пор регулярные выраже­

ния служили для обнаружения совпадений с текстом, но

иногда требуются выражения для отметки позиции в сов­
павшем тексте, в отличие от самого текста. Для данной цели
служит позиционный просмотр

-

возможность выполнять

просмотр вперед и назад, поясняемая в этом уроке.

Общее представление
о позиционном просмотре
Начнем, как всегда, с конкретного примера. Допустим,

что требуется извлечь заглавие из веб-страницы. Загла­
вия

ми

НТМL-страниц



и

размещаются



в разделе

между



дескриптора­

кода НТМL­

разметки. В следующем примере демонстрируется решение
поставленной задачи.

Текст


Ben Forta's Homepage

Реrvлярное выражение

.*

124

Урок

9

Просмотр вперед и назад

Результат



Анализ
Шаблон

(11)

[еЕ]

>

< [tT] [iI] [tT] (11)

[еЕ]

>. *