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

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

Жанры

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

Возможно, вы заметили, что я пользовался обычными комментариями Ruby (

# ...
), а не специальными, применяемыми в регулярных выражениях (
(?#...)
). Почему? Просто потому, что это разрешено! Специальный комментарий необходим только тогда, когда его следует закончить раньше конца строки (например, если в той же строке за комментарием продолжается регулярное выражение).

3.10. Сопоставление точки символу конца строки

Обычно точка соответствует любому символу, кроме конца строки. Если задан модификатор

многострочности m, точка будет сопоставляться и с этим символом. Другой способ — задать флаг
Regexp::MULTILINE
при создании регулярного выражения:

str = "Rubies are red\nAnd violets are blue.\n"

pat1 = /red./

pat2 = /red./m

str =~ pat1 # nil

str =~ pat2 # 11

Этот режим не оказывает влияния на то, где устанавливается соответствие якорям (

^
,
$
,
\A
,
\Z
). Изменяется только способ сопоставления с точкой.

3.11. Внутренние модификаторы

Обычно модификаторы (например,

i
или
m
) задаются после регулярного выражения. Но что если мы хотим применить модификатор только к части выражения?

Существует специальная нотация для включения и выключения модификаторов. Заключенный в круглые скобки вопросительный знак, за которым следует один или несколько модификаторов, «включает» их до конца регулярного выражения. А если некоторым модификаторам предшествует минус, то соответствующие режимы «выключаются»:

/abc(?i)def/ # Соответствует abcdef, abcDEF, abcDef,

# но не ABCdef.

/ab(?i)cd(?-i)ef/# Соответствует abcdef, abCDef, abcDef, ...,

# но не ABcdef или abcdEF.

/(?imx).*/ # To же, что /.*/imx

/abc(?i-m).*/m # Для последней части регулярного выражения включить

# распознавание регистра, выключить многострочный

# режим.

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

/ab(?i:cd)ef/ # То же, что /ab(?i)cd(?-i)ef/

По техническим причинам использовать таким образом модификатор

о
нельзя. Модификатор
x
— можно, но я не знаю, кому бы это могло понадобиться.

3.12. Внутренние подвыражения

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

?>
:

re = /(?>abc)(?>def)/ # То же, что /abcdef/

re.match("abcdef").to_a # ["abcdef"]

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

Еще обратим внимание на то, что эта

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

str = "abccccdef"

re1 = /(abc*)cdef/

re2 = /(?>abc*)cdef/

re1 =~ str # 0

re2 =~ str # nil

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

re2.match(str).to_a # []

В предыдущем примере подвыражение

abc*
выражения
re2
поглощает все вхождения буквы
с
и (в соответствии с собственническим инстинктом) не отдает их назад, препятствуя возврату.

3.13. Ruby и Oniguruma

Новая библиотека регулярных выражений в Ruby называется Oniguruma. Это японское слово означает что-то вроде «колесо духов». (Те, кто не владеет японским, часто пишут его неправильно; имейте в виду, что тут не обойтись без «guru»!)

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

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

3.13.1. Проверка наличия Oniguruma

Если вас интересует библиотека Oniguruma, то первым делом нужно выяснить, есть ли она в вашем экземпляре Ruby. В версиях 1.8.4 и младше ее, скорее всего, нет. Стандартно она включается в дистрибутив версии 1.9.

Вот как можно без труда выяснить, присутствует ли Oniguruma, проверив три условия. Во-первых, как я сказал, она стандартно поставляется в версии 1.9 и старше. В последних версиях обеих библиотек для работы с регулярными выражениями определена строковая константа

Regexp::ENGINE
. Если она содержит подстроку
Oniguruma
, то у вас новая библиотека. И последний шаг: если вы все еще не знаете, с какой библиотекой работаете, можно попытаться вычислить регулярное выражение, записанное в «новом» синтаксисе. Если при этом возникнет исключение
SyntaxError
, значит, у вас старая библиотека; в противном случае — новая.

def oniguruma?

 return true if RUBY_VERSION >= "1.9.0"

 if defined?(Regexp::ENGINE) # Константа ENGINE определена?

if Regexp::ENGINE.include?('Oniguruma')

return true # Какая-то версия Oniguruma.

else

return false # Старая библиотека,

end

 end

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

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Огненный наследник

Тарс Элиан
10. Десять Принцев Российской Империи
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Огненный наследник

Позывной "Князь"

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

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

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

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

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Неправильный лекарь. Том 4

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

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Третий Генерал: Том XIII

Зот Бакалавр
12. Третий Генерал
Фантастика:
боевая фантастика
фэнтези
аниме
5.00
рейтинг книги
Третий Генерал: Том XIII

Третий Генерал: Том VII

Зот Бакалавр
6. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
5.00
рейтинг книги
Третий Генерал: Том VII

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

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