Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
# "gamma "
p3 = refs.begin(2) # 11
p4 = refs.end(2) # 17
# "delta "
p5 = refs.begin(3) # 17
p6 = refs.end(3) # 23
# "beta gamma delta"
p7 = refs.begin(0) # 6
p8 = refs.end(0) # 23
Аналогично метод
offset
range0 = refs.offset(0) # [6,23]
range1 = refs.offset(1) # [6,11]
range2 = refs.offset(2) # [11,17]
range3 = refs.offset(3) # [17,23]
Части строки, которые находятся перед сопоставленной подстроки и после нее, можно получить методами
pre_match
post_match
before = refs.pre_match # "alpha "
after = refs.post_match # "epsilon"
3.8. Классы символов
Классы символов — это просто форма перечисления (указание альтернатив), в котором каждая группа состоит из одного символа. В простейшем случае список возможных символов заключается в квадратные скобки:
/[aeiou]/ # Соответствует любой из букв а, е, i, о, и; эквивалентно
# /(a|e|i|o|u)/, только группа не запоминается.
Внутри класса символов управляющие последовательности типа
n
.
?
/[.n?]/ # Сопоставляется с точкой, символом новой строки,
# вопросительным знаком.
Символ каре (
^
[^aeiou] # Любой символ, КРОМЕ а, е, i, о, и.
Дефис внутри класса символов обозначает диапазон (в лексикографическом порядке):
/[а-mA-М]/ # Любой символ из первой половины алфавита.
/[^а-mA-М]/ # Любой ДРУГОЙ символ, а также цифры и символы. отличные
# от букв и цифр.
Дефис в начале или в конце класса символов, а также каре в середине теряют специальный смысл и интерпретируются буквально. То же относится к левой квадратной скобке, но правая квадратная скобка, очевидно, должна экранироваться:
/[-^[]]/ # Сопоставляется с дефисом, каре и правой квадратной скобкой.
Регулярные выражения в Ruby могут содержать ссылки на именованные классы символов вида
[[:name:]]
[[:digit:]]
[0-9]
Есть еще такие именованные классы:
[[:print:]]
[[:alpha:]]
s1 = "abc 07def"
/[[:print:]]*/.match(s1)
m1 = Regexp::last_match[0] # "abc"
s2 = "1234def"
/[[:digit:]]*/.match(s2)
m2 = Regexp::last_match[0] # "1234"
/[[:digit:]] + [[:alpha:]]/.match(s2)
m3 = Regexp::last_match[0] # "1234d"
Каре перед именем класса символов формирует его дополнение:
/[[:^alpha:]]/ # Все символы, кроме букв.
Для многих классов имеется также сокращенная нотация. Наиболее распространены сокращения
d
w
s
str1 = "Wolf 359"
/w+/.match(str1) # Соответствует "Wolf" (то же, что /[a-zA-Z_0-9]+/)
/w+ d+/.match(str1) # Соответствует "Wolf 359"
/w+ w+/.match(str1) # Соответствует "Wolf 359"
/s+/.match(str1) # Соответствует " "
«Дополнительные» формы обычно записываются в виде прописной буквы:
/W/ # Любой символ, не входящий в состав слова.
/D/ # Все кроме цифр.
/S/ # Все кроме пропусков.
Дополнительная информация, относящаяся только к Oniguruma, приводится в разделе 3.13.
3.9. Обобщенные регулярные выражения
Регулярные выражения, особенно длинные, часто выглядят загадочно. Модификатор
x
Чтобы привести несколько искусственный пример умеренно сложного регулярного выражения, предположим, что имеется такой список адресов:
addresses =
[ "409 W Jackson Ave", "No. 27 Grande Place",
"16000 Pennsylvania Avenue", "2367 St. George St.",
"22 Rue Morgue", "33 Rue St. Denis",
"44 Rue Zeeday", "55 Santa Monica Blvd.",
"123 Main St., Apt. 234", "123 Main St., #234",
"345 Euneva Avenue, Suite 23", "678 Euneva Ave, Suite A"]
Здесь каждый адрес состоит из трех частей: номер дома, название улицы и необязательный номер квартиры. Я предполагаю, что перед числом может быть необязательная строка
No.
Apt.
Suit
#