Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Глава 3. Регулярные выражения

Я провела бы его по лабиринту, где тропы орнаментом украшены…

Эми Лоуэлл

Мощь регулярных выражений как инструмента программирования часто недооценивается. Первые теоретические исследования на эту тему датируются сороковыми годами прошлого века, в вычислительные системы они проникли в 1960-х годах, а затем были включены в различные инструментальные средства операционной системы UNIX. В 1990-х годах популярность языка Perl привела к тому, что регулярные выражения вошли в обиход, перестав быть уделом бородатых гуру

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

Во время работы над данной книгой язык Ruby находился в переходном состоянии. Старая библиотека регулярных выражений заменялась новой под названием Oniguruma. Этой библиотеке посвящен раздел 3.13 данной главы.

Что касается интернационализации, то это тема главы 4.

3.1. Синтаксис регулярных выражений

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

%r
. В таблице 3.1 приведены примеры простых регулярных выражений:

Таблица 3.1. Простые регулярные выражения

Регулярное выражение Пояснение
/Ruby/
Соответствует одному слову Ruby
/[Rr]uby/
Соответствует Ruby или ruby
/^abc/
Соответствует abc в начале строки
%r(xyz$)
Соответствует xyz в конце строки
%r|[0-9]*|
Соответствует любой последовательности из нуля или более цифр

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

Таблица 3.2. Модификаторы регулярных выражений

Модификатор Назначение
I
Игнорировать регистр
O
Выполнять подстановку выражения только один раз
M
Многострочный режим (точка сопоставляется с символом новой строки)
X
Обобщенное регулярное выражение (допускаются пробелы и комментарии)

Дополнительные примеры будут рассмотрены в главе 4. Чтобы завершить введение в регулярные выражение, в таблице 3.3 мы приводим наиболее употребительные символы и обозначения.

Таблица 3.3. Общеупотребительные обозначения в регулярных выражениях

Обозначение Пояснение
^
Начало строки текста (line) или строки символов (string)
$
Конец строки текста или строки символов
.
Любой символ, кроме символа новой строки (если не установлен многострочный режим)
\w
Символ - часть слова (цифра, буква или знак подчеркивания)
\W
Символ, не являющийся частью слова
\s
Пропуск (пробел, знак табуляции, символ новой строки и т.д.)
\S
Символ, не являющийся пропуском
\d
Цифра (то же, что [0-9])
\D
Не цифра
\A
Начало строки символов (string)
\Z
Конец строки символов или позиция перед конечным символом новой строки
\z
Конец строки символов (string)
\b
Граница слова (только вне квадратных скобок [ ])
\B
Не граница слова
\b
Забой (только внутри квадратных скобок [ ])
[]
Произвольный набор символов
*
0 или более повторений предыдущего подвыражения
*?
0 или более повторений предыдущего подвыражения (нежадный
алгоритм)
+
1 или более повторений предыдущего подвыражения
+?
1 или более повторений предыдущего подвыражения (нежадный алгоритм)
{m, n}
От m до n вхождений предыдущего подвыражения
{m, n}?
От m до n вхождений предыдущего подвыражения (нежадный алгоритм)
?
0 или 1 повторений предыдущего подвыражения
|
Альтернативы
(?= )
Позитивное заглядывание вперед
(?! )
Негативное заглядывание вперед
Группировка подвыражений
(?> )
Вложенное подвыражение
(?: )
Несохраняющая группировка подвыражений
(?imx-imx)
Включить/выключить режимы, начиная с этого места
(?imx-imx: expr)
Включить/выключить режимы для этого выражения
(?# )
Комментарий

Умение работать с регулярными выражениями — большой плюс для современного программиста. Полное рассмотрение этой темы выходит далеко за рамки настоящей книги, но, если вам интересно, можете обратиться к книге Jeffrey Friedl, Mastering Regular Expressions [8] .

Дополнительный материал вы также найдете в разделе 3.13.

3.2. Компиляция регулярных выражений

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

Regexp.compile
(синоним
Regexp.new
). Первый параметр обязателен, он может быть строкой или регулярным выражением. (Отметим, что если этот параметр является регулярным выражением с дополнительными флагами, то флаги не будут перенесены в новое откомпилированное выражение.)

8

Дж. Фридл. Регулярные выражения. — Питер, 2003 (Прим. перев.)

pat1 = Regexp.compile("^foo.*") # /^foo.*/

pat2 = Regexp.compile(/bar$/i) # /bar/ (i не переносится)

Если второй параметр задан, обычно это поразрядное объединение (ИЛИ) каких-либо из следующих констант:

Regexp::EXTENDED
,
Regexp::IGNORECASE
,
Regexp::MULTILINE
. При этом любое отличное от
nil
значение приведет к тому, что регулярное выражение не будет различать регистры; мы рекомендуем опускать второй параметр.

options = Regexp::MULTILINE || Regexp::IGNORECASE

pat3 = Regexp.compile("^foo", options)

pat4 = Regexp.compile(/bar/, Regexp::IGNORECASE)

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

"N" или "n" означает отсутствие поддержки

"Е" или "е" означает EUC

"S" или "s" означает Shift-JIS

"U" или "u" означает UTF-8

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

new
или compile. Достаточно заключить его в ограничители (символы косой черты).

pat1 = /^fоо.*/

pat2 = /bar$/i

Более подробная информация приводится в главе 4.

3.3. Экранирование специальных символов

Метод класса

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

str1 = "[*?]"

str2 = Regexp.escape(str1) # "\[\*\?\]"

Синонимом является метод

Regexp.quote
.

3.4. Якоря

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

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

^
и
$
, которые соответствуют началу и концу строки символов.

Поделиться:
Популярные книги

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Олимпия Клевская

Дюма-отец Александр
Приключения:
исторические приключения
6.80
рейтинг книги
Олимпия Клевская

Собрание сочинений, том 1. Белый вождь. Квартеронка.

Рид Томас Майн
1. Собрание сочинений в 6 томах
Приключения:
приключения про индейцев
вестерны
7.86
рейтинг книги
Собрание сочинений, том 1. Белый вождь. Квартеронка.

История Второй мировой войны. Блицкриг

Фон Типпельскирх Курт
Вторая мировая. Взгляд врага
Научно-образовательная:
история
7.14
рейтинг книги
История Второй мировой войны. Блицкриг

След Вечности

Иевлев Геннадий Васильевич
Фантастика:
научная фантастика
5.00
рейтинг книги
След Вечности

Мой идеальный смерч

Джейн Анна
1. Мой идеальный смерч
Юмор:
юмористическая проза
9.18
рейтинг книги
Мой идеальный смерч

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.39
рейтинг книги
Князь Мещерский

Мир “Искателя” (сборник)

Брэдбери Рэй Дуглас
Журнал «Искатель»
Фантастика:
научная фантастика
7.00
рейтинг книги
Мир “Искателя” (сборник)

Русская мафия 1991–2014. Новейшая история бандитской России

Карышев Валерий Михайлович
Энциклопедия криминала
Документальная литература:
прочая документальная литература
5.00
рейтинг книги
Русская мафия 1991–2014. Новейшая история бандитской России

Жизнь животных. Рыбы и амфибии

Брем Альфред Эдмунд
Жизнь животных
Научно-образовательная:
биология
5.00
рейтинг книги
Жизнь животных. Рыбы и амфибии

Дом глав Дюны

Херберт Фрэнк
5.00
рейтинг книги
Дом глав Дюны

Тот, кто знает. Книга вторая. Перекресток

Маринина Александра
5.00
рейтинг книги
Тот, кто знает. Книга вторая. Перекресток

На веки вечные. Дилогия

Звягинцев Александр Григорьевич
На веки вечные. Роман-хроника времен Нюрнбергского процесса
Проза:
историческая проза
5.00
рейтинг книги
На веки вечные. Дилогия

Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Замуж второй раз, или Ещё посмотрим, кто из нас попал!