Книга: Программирование на языке 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.

Оглавление книги


Генерация: 1.137. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз