b = s1.count('bdr') # 5
Строковый параметр ведет себя как простое регулярное выражение. Если он начинается с символа ^, то берется дополнение к списку:
c = s1.count('^а') # 6
d = s1.count ('^bdr') # 6
Дефис обозначает диапазон символов:
e = s1.count('a-d') # 9
f = s1.count('^a-d') # 2
2.29. Обращение строки
Для обращения строки служит метод reverse (или его вариант для обращения «на месте» reverse!):
s1 = 'Star Trek'
s2 = s1.reverse # 'kerT ratS'
si.reverse! # si теперь равно 'kerT ratS'
Пусть требуется обратить порядок слов (а не символов). Тогда можно сначала воспользоваться методом String#split, который вернет массив слов. В классе Array тоже есть метод reverse, поэтому можно обратить массив, а затем с помощью метода join объединить слова в новую строку:
phrase = 'Now here's a sentence'
phrase.split(' ').reverse.join(' ')
# 'sentence a here's Now'
2.30. Удаление дубликатов
Цепочки повторяющихся символов можно сжать до одного методом squeeze:
s1 = 'bookkeeper'
s2 = s1.squeeze # 'bokeper'
s3 = 'Hello...'
s4 = s3.squeeze # 'Helo.'
Если указан параметр, то будут удаляться только дубликаты заданных в нем символов:
s5 = s3.squeeze('.') # 'Hello.'
Этот параметр подчиняется тем же правилам, что и параметр метода count (см. раздел 2.28), то есть допускаются дефис и символ ^. Имеется также метод squeeze! .
2.31. Удаление заданных символов
Метод delete удаляет из строки те символы, которые включены в список, переданный в качестве параметра:
s1 = 'To be, or not to be'
s2 = s1.delete('b') # 'To e, or not to e'
s3 = 'Veni, vidi, vici!'
s4 = s3.delete(',!') # 'Veni vidi vici'
Этот параметр подчиняется тем же правилам, что и параметр метода count (см. раздел 2.28), то есть допускаются символы - (дефис) и ^ (каре). Имеется также метод delete!.
2.32. Печать специальных символов
Метод dump позволяет получить графическое представление символов, которые обычно не печатаются вовсе или вызывают побочные эффекты:
s1 = 'Внимание' << 7 << 7 << 7 # Добавлено три символа ASCII BEL.
puts s1.dump # Печатается: Внимание 07 07 07
s2 = 'abc def ghi
'
puts s2.dump # Печатается: abc def ghi
s3 = 'Двойная кавычка: ''
puts s3.dump # Печатается: Двойная кавычка: '
При стандартном значении переменной $KCODE метод dump дает такой же эффект, как вызов метода inspect для строки. Переменная $KCODE рассматривается в главе 4.
2.33. Генерирование последовательности строк
Изредка бывает необходимо получить «следующую» строку. Так, следующей для строки 'aaa' будет строка 'aab' (затем 'aac', 'aad' и так далее). В Ruby для этой цели есть метод succ:
droid = 'R2D2'
improved = droid.succ # 'R2D3'
pill = 'Vitamin B'
pill2 = pill.succ # 'Vitamin C'
He рекомендуется применять этот метод, если точно не известно, что начальное значение предсказуемо и разумно. Если начать с какой-нибудь экзотической строки, то рано или поздно вы получите странный результат.
Существует также метод upto, который в цикле вызывает succ, пока не будет достигнуто конечное значение:
'Files, A'.upto 'Files, X' do | letter |
puts 'Opening: #{letter}'
end
# Выводится 24 строки.
Еще раз подчеркнем, что эта возможность используется редко, да и то на ваш страх и риск. Кстати, метода, возвращающего «предшествующую» строку, не существует.
2.34. Вычисление 32-разрядного CRC
