end
if string[0..0] =~ /[A-Z]/
puts 'строка начинается с прописной буквы'
end
Отметим, что все эти методы не учитывают местные особенности (locale).
2.12. Вычленение и замена подстрок
В Ruby к подстрокам можно обращаться разными способами. Обычно применяются квадратные скобки, как для массивов, но внутри скобок может находиться пара объектов класса Fixnum
, диапазон, регулярное выражение или строка. Ниже мы рассмотрим все варианты.
Если задана пара объектов класса Fixnum
, то они трактуются как смещение от начала строки и длина, а возвращается соответствующая подстрока.
str = 'Шалтай-Болтай'
sub1 = str[7,4] # 'Болт'
sub2 = str[7,99] # 'Болтай' (выход за границу строки допускается)
sub3 = str[10,-4] # nil (отрицательная длина)
Важно помнить, что это именно смещение и длина (число символов), а не начальное и конечное смещение.
Если индекс отрицателен, то отсчет ведется от конца строки. В этом случае индекс начинается с единицы, а не с нуля. Но при нахождении подстроки указанной длины все равно берутся символы правее, а не левее начального:
str1 = 'Алиса'
sub1 = str1[-3,3] # 'иса'
str2 = 'В Зазеркалье'
sub3 = str2[-8,6] # 'зеркал'
Можно задавать диапазон. Он интерпретируется как диапазон позиций внутри строки. Диапазон может включать отрицательные числа, но в любом случае нижняя граница не должна быть больше верхней. Если диапазон «инвертированный» или нижняя граница оказывается вне строки, возвращается nil
:
str = 'Уинстон Черчилль'
sub1 = str[8..13] # 'Черчил'
sub2 = str[-4..-1] # 'илль'
sub3 = str[-1..-4] # nil
sub4 = str[25..30] # nil
Если задано регулярное выражение, то возвращается строка, соответствующая образцу. Если соответствия нет, возвращается nil
:
str = 'Alistair Cooke'
sub1 = str[/1..t/] # 'list'
sub2 = str[/s.*r/] # 'stair'
sub3 = str[/foo/] # nil
Если задана строка, то она и возвращается, если встречается в качестве подстроки в исходной строке; в противном случае возвращается nil
:
str = 'theater'
sub1 = str['heat'] # 'heat'
sub2 = str['eat'] # 'eat'
sub3 = str['ate'] # 'ate'
sub4 = str['beat'] # nil
sub5 = str['cheat'] # nil
Наконец, в тривиальном случае, когда в качестве индекса задано одно число Fixnum
, возвращается ASCII-код символа в соответствующей позиции (или nil
, если индекс выходит за границы строки):
str = 'Aaron Burr'
ch1 = str[0] # 65
ch1 = str[1] # 97
ch3 = str[99] # nil
Важно понимать, что все описанные выше способы могут использоваться не только для доступа к подстроке, но и для ее замены:
str1 = 'Шалтай-Болтай'
str1[7,3] = 'Хва' # 'Шалтай-Хватай'
str2 = 'Алиса'
str2[-3,3] = 'ександра' # 'Александра'
str3 = 'В Зазеркалье'
str3[-9,9] = 'стеколье' # 'В Застеколье'
str4 = 'Уинстон Черчилль'
str4[8..11] = 'X' # 'Уинстон Хилль'
str5 = 'Alistair Cooke'
str5[/e$/] ='ie Monster' # 'Alistair Cookie Monster'
str6 = 'theater'
str6['er'] = 're' # 'theatre'
str7 = 'Aaron Burr'
str7[0] = 66 # 'Baron Burr'
Присваивание выражения, равного nil
, не оказывает никакого действия.
2.13. Подстановка в строках
Мы уже видели, как выполняются простые подстановки. Методы sub
и gsub
предоставляют более развитые средства, основанные на сопоставлении с образцом. Имеются также варианты sub!
и gsub!
, позволяющие выполнить подстановку «на месте».
Метод sub
заменяет первое вхождение строки, соответствующей образцу, другой строкой или результатом вычисления блока:
s1 = 'spam, spam, and eggs'
s2 = s1.sub(/spam/,'bacon') # 'bacon, spam, and eggs'
s3 = s2.sub(/(w+), (w+),/,'2, 1,') # 'spam, bacon, and eggs'
s4 = 'Don't forget the spam.'
s5 = s4.sub(/spam/) { |m| m.reverse } # 'Don't forget the maps.'
s4.sub!(/spam/) { |m| m.reverse }
# s4 теперь равно 'Don't forget the maps.'
Как видите, в подставляемой строке могут встречаться специальные символы 1
, 2
и т.д. Но такие специальные переменные, как $&
(или ее англоязычная версия $MATCH
), не допускаются.
Если употребляется форма с блоком, то допустимы и специальные переменные. Если вам нужно лишь получить сопоставленную с образцом строку, то она будет передана в блок как параметр. Если эта строка вообще не нужна, то параметр, конечно, можно опустить.