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

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

Жанры

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

string = "abcXdefXghi"

/def/ =~ string # 4

/аbс/ =~ string # 0

/ghi/ =~ string # 8

/^def/ =~ string # nil

/def$/ =~ string # nil

/^аbс/ =~ string # 0

/ghi$/ =~ string # 8

Впрочем, я немного уклонился от истины. Эти якоря на самом деле соответствуют началу и концу не строки символов (string), а строки текста (line). Вот что произойдет, если те же самые образцы применить к строке, внутри которой есть символы новой строки:

string = "abc\ndef\nghi"

/def/ =~ string # 4

/abc/ =~ string # 0

/ghi/ =~ string # 8

/^def/ =~ string # 4

/def$/ =~ string # 4

/^abc/ =~ string # 0

/ghi$/ =~ string # 8

Однако имеются якоря

\A
и
\Z
, которые соответствуют именно началу и концу самой строки символов.

string = "abc\ndef\nghi"

/\Adef/ =~ string # nil

/def\Z/ =~ string # nil

/\Aabc/ =~ string # 0

/ghi\Z/ =~ string # 8

Якорь

\z
отличается от
\Z
тем, что последний устанавливает соответствие перед конечным символом новой строки, а первый должен соответствовать явно.

string = "abc\ndef\nghi"

str2 << "\n"

/ghi\Z/ =~ string # 8

/\Aabc/ =~ str2 # 8

/ghi\z/ =~ string # 8

/ghi\z/ =~ str2 # nil

Можно также устанавливать соответствие на границе слова с помощью якоря

\b
или с позицией, которая не находится на границе слова (
\B
). Примеры использования метода
gsub
показывают, как эти якоря работают:

str = "this is a test"

str.gsub(/\b/,"|") # "|this| |is| |a| |test|"

str.gsub(/\В/, "-") # "t-h-i-s i-s a t-e-s-t"

He существует способа отличить начало слова от конца.

3.5. Кванторы

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

pattern = /ax?b/

pat2 = /а[xy]?b/

pattern =~ "ab" # 0

pattern =~ "acb" # nil

pattern =~ "axb" # 0

pat2 =~ "ayb" # 0

pat2 =~ "acb" # nil

Элементы часто повторяются неопределенное число раз (для формулировки этого условия служит квантор

+
). Например, следующий образец соответствует любому положительному числу:

pattern = /[0-9]+/

pattern =~ "1" # 0

pattern =~ "2345678" # 0

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

+
и
?
. Вот, например, как сказать, что после строки Huzzah должно быть нуль или более восклицательных знаков:

pattern = /Huzzah(!+)?/ # Скобки здесь обязательны.

pattern =~ "Huzzah" # 0

pattern =~ "Huzzah!!!!" # 0

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

*
.

pattern = /Huzzah!*/ # * применяется только к символу !

pattern =~ "Huzzah" # 0

pattern =~ "Huzzah!!!!" # 0

Как распознать американский номер социального страхования? С помощью такого образца:

ssn = "987-65-4320"

pattern = /\d\d\d-\d\d-\d\d\d\d/

pattern =~ ssn # 0

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

pattern = /\d{3}-\d{2}-\d{4}/

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

Можно также использовать диапазоны, границы которых разделены запятой. Предположим, что номер телефона в Элбонии состоит из двух частей: в первой может быть от трех до пяти цифр, а во второй — от трех до семи. Вот как выглядит соответствующий образец:

elbonian_phone = /\d{3,5}-\d{3,7}/

Нижняя и верхняя границы диапазона необязательны (но хотя бы одна должна быть задана):

/x{5}/ # Соответствует 5 x.

/x{5,7}/ # Соответствует 5-7 x.

/x{,8}/ # Соответствует не более 8 x.

/x{3,}/ # Соответствует по меньшей мере 3 x.

Ясно, что кванторы

?
,
+
и
*
можно переписать и так:

/x?/ # То же, что /x{0,1}/

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

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Я - злодейка в дораме. Сезон второй

Вострова Екатерина
2. Выжить в дораме
Фантастика:
уся
фэнтези
сянься
попаданцы
5.00
рейтинг книги
Я - злодейка в дораме. Сезон второй

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Старый, но крепкий 3

Крынов Макс
3. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 3

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Воин-Врач

Дмитриев Олег
1. Воин-Врач
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
6.00
рейтинг книги
Воин-Врач

Защитник

Кораблев Родион
11. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Защитник

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора