Книга: Программирование на языке Ruby
3.8. Классы символов
3.8. Классы символов
Классы символов — это просто форма перечисления (указание альтернатив), в котором каждая группа состоит из одного символа. В простейшем случае список возможных символов заключается в квадратные скобки:
/[aeiou]/ # Соответствует любой из букв а, е, i, о, и; эквивалентно
# /(a|e|i|o|u)/, только группа не запоминается.
Внутри класса символов управляющие последовательности типа n по-прежнему распознаются, но такие метасимволы, как .
и ?
, не имеют специального смысла:
/[.n?]/ # Сопоставляется с точкой, символом новой строки,
# вопросительным знаком.
Символ каре (^
) внутри класса символов имеет специальный смысл, если находится в начале; в этом случае он формирует дополнение к списку символов:
[^aeiou] # Любой символ, КРОМЕ а, е, i, о, и.
Дефис внутри класса символов обозначает диапазон (в лексикографическом порядке):
/[а-mA-М]/ # Любой символ из первой половины алфавита.
/[^а-mA-М]/ # Любой ДРУГОЙ символ, а также цифры и символы. отличные
# от букв и цифр.
Дефис в начале или в конце класса символов, а также каре в середине теряют специальный смысл и интерпретируются буквально. То же относится к левой квадратной скобке, но правая квадратная скобка, очевидно, должна экранироваться:
/[-^[]]/ # Сопоставляется с дефисом, каре и правой квадратной скобкой.
Регулярные выражения в Ruby могут содержать ссылки на именованные классы символов вида [[:name:]]
. Так, [[:digit:]]
означает то же самое, что образец [0-9]
. Во многих случаях такая запись оказывается короче или, по крайней мере, понятнее.
Есть еще такие именованные классы: [[:print:]]
(символы, имеющие графическое начертание) и [[:alpha:]]
(буквы):
s1 = "abc07def"
/[[: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.1. Синтаксис регулярных выражений
- 3.2. Компиляция регулярных выражений
- 3.3. Экранирование специальных символов
- 3.4. Якоря
- 3.5. Кванторы
- 3.6. Позитивное и негативное заглядывание вперед
- 3.7. Обратные ссылки
- 3.8. Классы символов
- 3.9. Обобщенные регулярные выражения
- 3.10. Сопоставление точки символу конца строки
- 3.11. Внутренние модификаторы
- 3.12. Внутренние подвыражения
- 3.13. Ruby и Oniguruma
- 3.14. Примеры регулярных выражений
- 3.15. Заключение
- 3.3. Экранирование специальных символов
- 10.1.2. Классы символов
- Имена объектов длиной 68 символов
- 9.1. Классы и прототипы
- Классы сертификатов
- Статические классы
- На сайтах вместо текста отображается непонятный набор символов
- В Adobe Acrobat Reader русский текст на экране читается нормально, а при печати получается текст из набора символов. Как...
- Наборы символов Firebird
- 9.8. Классы в ECMAScript 5
- 9.7.4. Иерархии классов и абстрактные классы
- Классы синхронизации, внедренные в версии .NET Framework 4.0