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

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

Жанры

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

# THIS IS A PARAGRAPH WITH SOME

# <i>ITALICS</i> AND SOME <b>BOLDFACE</b>

# IN IT...

# </body>

3.13.5. Еще о кванторах

Мы уже встречались с атомарными подвыражениями в «классической» библиотеке регулярных выражений в Ruby. Они выделяются с помощью нотации (

?>...
) и являются «собственническими» в том смысле, что жадные и не допускают возврата внутрь подвыражения.

Oniguruma предлагает еще один способ выразить собственническую природу — с помощью квантора

+
. Он отличается от метасимвола
+
в смысле «один или более» и даже может использоваться с ним совместно. (На самом деле это «вторичный» квантор, как и
?
, который можно употреблять в таких контекстах, как
??
,
+?
и
*?
.)

Применение

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

r1 = /x*+/ # То же, что /(?>x*)/

r2 = /x++/ # То же, что /(?>x+)/

r3 = /x?+/ # То же, что /(?>x?)/

По техническим причинам Ruby не считает конструкцию

{n,m}+
собственнической.

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

3.13.6. Именованные соответствия

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

Синтаксически это выглядит так: (

?<name>expr
), где name — имя, начинающееся с буквы (как идентификаторы в Ruby). Обратите внимание на сходство этой конструкции с неименованным атомарным подвыражением.

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

re1 = /\s+(\w+)\s+\1\s+/

str = "Now is the the time for all..."

re1.match(str).to_a # ["the the","the"]

Здесь мы запомнили слово, а затем сослались на него по номеру

\1
. Примерно так же можно пользоваться ссылками на именованные выражения. При первом обнаружении подвыражения ему присваивается имя, а в обратной ссылке употребляется символ
\k
, за которым следует это имя (всегда в угловых скобках):

re2 = /\s+(?<anyword>\w+)\s+\k<anyword>\s+/

Второй вариант длиннее, зато понятнее. (Имейте в виду, что в одном и том же регулярном выражении нельзя использовать и именованные, и нумерованные обратные ссылки.) Если нравится, пользуйтесь!

В Ruby уже давно можно включать обратные ссылки в строки, передаваемые методам

sub
и
gsub
. Раньше с этой целью допускалось лишь использование нумерованных ссылок, но в самых последних версиях именованные тоже разрешены:

str = "I breathe when I sleep"

# Нумерованные соответствия...

r1 = /I (\w+) when I (\w+)/

s1 = str.sub(r1,' I \2 when I \1')

# Именованные соответствия...

r1 = /I (?<verb1>\w+) when I (?<verb2>\w+)/

s2 = str.sub(r2,'I \k<verb2> when I \k<verb1>')

Puts s1 # I sleep when I breathe

Puts s2 # I sleep when I breathe

Еще одно возможное применение именованных выражений — повторное употребление выражения. В таком случае перед именем ставится символ

\g
(а не
\k
). Определим, например, образец spaces так, чтобы можно было использовать его многократно. Тогда последнее выражение примет вид:

re3 = /(?<spaces>\s+)(?<anyword>\w+)\g<spaces>\k<anyword>\g<spaces>/

Обратите внимание, что этот образец многократно употребляется с помощью маркера

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

Нотацией

\g<1>
можно пользоваться и тогда, когда именованных подвыражений нет. Тогда запомненное ранее подвыражение вызывается по номеру, а не по имени.

И последнее замечание об именованных соответствиях. В самых последних версиях Ruby имя (в виде строки или символа) может передаваться методу

MatchData
в качестве индекса, например:

str = "My hovercraft is full of eels"

reg = /My (?<noun>\w+) is (?<predicate>.*)/

m = reg.match(str)

puts m[:noun] # hovercraft

puts m["predicate"] # full of eels

puts m[1] # то же, что m[:noun] или m["noun"]

Как видите, обычные индексы тоже не запрещены. Обсуждается возможность добавить в объект

MatchData
и синглетные методы.

puts m.noun

puts m.predicate

Но во время работы над книгой это еще не было реализовано.

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

Атаман. Гексалогия

Корчевский Юрий Григорьевич
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
8.15
рейтинг книги
Атаман. Гексалогия

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Приказано выжить!

Малыгин Владимир
1. Другая Русь
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.09
рейтинг книги
Приказано выжить!

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Курсант поневоле

Шелег Дмитрий Витальевич
1. Кровь и лёд
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Курсант поневоле

Адвокат Империи 4

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

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Последний Паладин. Том 11

Саваровский Роман
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 11

Император Пограничья 6

Астахов Евгений Евгеньевич
6. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 6

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Законы Рода. Том 10

Мельник Андрей
10. Граф Берестьев
Фантастика:
юмористическая фантастика
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 10

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов