Ruby Строка

В Ruby объекты String используются для хранения или обработки последовательностей из одного или нескольких байтов.

Строки Ruby делятся на строки в одинарных кавычках (') и строки в двойных кавычках ("). Разница в том, что строки в двойных кавычках поддерживают больше экранирующих символов.

Строки в одинарных кавычках

Простейшие строки — это строки в одинарных кавычках, то есть строки, заключённые в одинарные кавычки:

'Это строка в программе на Ruby'

Если вам нужно использовать символ одинарной кавычки внутри строки в одинарных кавычках, нужно использовать обратную косую черту (\) внутри строки в одинарных кавычках, чтобы интерпретатор Ruby не рассматривал этот символ одинарной кавычки как завершение строки:

'Не\'хотите ли вы прочитать книгу О\'Райли\'?'

Обратная косая черта также может экранировать другую обратную косую черту, так что вторая обратная косая черта сама не интерпретируется как экранирующий символ.

Ниже приведены возможности, связанные со строками в Ruby.

Строки в двойных кавычках

В строках в двойных кавычках мы можем использовать#{}знак решётки и фигурные скобки для вычисления выражений:

Встраивание переменных в строки:

Примеры

#!/usr/bin/ruby # -*- coding: UTF-8 -*- name1 = "Joe" name2 = "Mary" puts "Привет #{name1}, где #{name2}?"

Попробуйте »

Приведённый выше пример выводит следующий результат:

你好 Joe,  Mary 在哪?

Выполнение математических операций в строках:

Примеры

#!/usr/bin/ruby # -*- coding: UTF-8 -*- x, y, z = 12, 36, 72 puts "Значение x равно #{ x }" puts "Значение x + y равно #{ x + y }" puts "Среднее значение x + y + z равно #{ (x + y + z)/3 }"

Попробуйте »

Приведённый выше пример выводит следующий результат:

x 的值为 12
x + y 的值为 48
x + y + z 的平均值为 40

Ruby также поддерживает строковые литералы, вводимые с помощью %q и %Q. %q использует правила заключения в одинарные кавычки, а %Q — правила заключения в двойные кавычки; после них идёт начальный разделитель, такой как ( ! [ { и т. д., и соответствующий конечный разделитель, такой как } ] ).

Символ, следующий за q или Q, является разделителем. Разделителем может быть любой неалфавитно-цифровой однобайтовый символ, например [, {, (, <, !, и т. д. Строка читается до тех пор, пока не будет найден соответствующий закрывающий разделитель.

Примеры

#!/usr/bin/ruby # -*- coding: UTF-8 -*- desc1 = %Q{Строки Ruby могут использовать '' и "".} desc2 = %q|Строки Ruby могут использовать '' и "".| puts desc1 puts desc2

Попробуйте »

Приведённый выше пример выводит следующий результат:

Ruby 的字符串可以使用 '' 和 ""。
Ruby 的字符串可以使用 '' 和 ""。

Экранирующие символы

В таблице ниже перечислены escape-символы или непечатаемые символы, которые можно экранировать с помощью нотации с обратной косой чертой.

Примечание:Внутри строки в двойных кавычках escape-символы обрабатываются. Внутри строки в одинарных кавычках escape-символы не обрабатываются и выводятся как есть.

Нотация с обратной косой чертойШестнадцатеричный символОписание
\a0x07Оповещение (звонок)
\b0x08Возврат на один символ
\cx Control-x
\C-x Control-x
\e0x1bEscape
\f0x0cПодача страницы
\M-\C-x Meta-Control-x
\n0x0aПеревод строки
\nnn Восьмеричное представление, где n принимает значения от 0 до 7
\r0x0dВозврат каретки
\s0x20Память
\t0x09Вкладка
\v0x0bВертикальная табуляция
\x Символ x
\xnn Шестнадцатеричное представление, где n находится в диапазоне 0-9, a-f или A-F

Кодировка символов

Набор символов по умолчанию в Ruby — ASCII, где символы могут быть представлены одним байтом. Если вы используете UTF-8 или другой современный набор символов, символы могут быть представлены от одного до четырёх байтов.

Вы можете использовать $KCODE в начале программы, чтобы изменить набор символов, как показано ниже:

$KCODE = 'u'

Ниже приведены возможные значения $KCODE.

КодированиеОписание
aASCII (то же, что none). Это значение по умолчанию.
eEUC.
nNone (то же, что ASCII).
uUTF-8.

Встроенные методы строк

Нам нужен экземпляр объекта String, чтобы вызывать методы String. Ниже показано, как создать экземпляр объекта String:

new [String.new(str="")]

Это вернёт новый строковый объект, содержащийstrкопию. Теперь, используяstrобъект, мы можем вызвать любой доступный метод экземпляра. Например:

Примеры

#!/usr/bin/ruby myStr = String.new("THIS IS TEST") foo = myStr.downcase puts "#{foo}"

Это даст следующий результат:

this is test

Ниже перечислены публичные методы строк (при условии, что str — объект String):

Нет.Метод и описание
1str % arg
Форматирует строку с использованием спецификации формата. Если arg содержит более одной подстановки, то arg должен быть массивом. Дополнительные сведения о спецификациях формата см. в описании sprintf в модуле Kernel.
2str * integer
Возвращает новую строку, содержащую integer копий str. Иными словами, str повторяется integer раз.
3str + other_str
Присоединяет other_str к str.
4str << obj
Присоединяет объект к строке. Если объект является Fixnum со значением от 0 до 255, он преобразуется в символ. Сравните это с concat.
5str <=> other_str
Сравнивает str с other_str, возвращая -1 (меньше), 0 (равно) или 1 (больше). Сравнение учитывает регистр.
6str == obj
Проверяет равенство str и obj. Если obj не является строкой, возвращает false; если str <=> obj возвращает 0, возвращает true.
7str =~ obj
Сопоставляет str с шаблоном регулярного выражения obj. Возвращает позицию, с которой начинается совпадение, иначе возвращает false.
8str[position] # Примечание: возвращает код ASCII, а не символ
str[start, length]
str[start..end]
str[start...end]

Извлекает подстроку по индексу.
9str.capitalize
Преобразует первую букву строки в верхний регистр, а остальные — в нижний для отображения.
10str.capitalize!
То же, что capitalize, но capitalize! возвращает nil, если изменения не вносятся.
11str.casecmp
Сравнение строк без учёта регистра.
12str.center
Центрирует строку.
13str.chomp
Удаляет разделитель записей ($/) из конца строки, обычно \n. Если разделителя записей нет, ничего не делает.
14str.chomp!
То же, что и chomp, но str изменяется и возвращается.
15str.chop
Удаляет последний символ из str.
16str.chop!
То же, что и chop, но str изменяется и возвращается.
17str.concat(other_str)
Присоединяет other_str к str.
18str.count(str, ...)
Подсчитывает один или несколько наборов символов. Если наборов символов несколько, подсчитывает пересечение этих наборов.
19str.crypt(other_str)
Применяет односторонний криптографический хеш к str. Аргумент — строка длиной в два символа, каждый символ в диапазоне a-z, A-Z, 0-9, ., или /.
20str.delete(other_str, ...)
Возвращает копию str, в которой удалены все символы, входящие в пересечение аргументов.
21str.delete!(other_str, ...)
То же, что delete, но str изменяется и возвращается.
22str.downcase
Возвращает копию str, в которой все прописные буквы заменены строчными.
23str.downcase!
То же, что downcase, но str изменяется и возвращается.
24str.dump
Возвращает версию str, в которой все непечатаемые символы заменены на нотацию \nnn, а все специальные символы экранированы.
25str.each(separator=$/) { |substr| block }
Разделяет str, используя аргумент как разделитель записей (по умолчанию — $/), передавая каждую подстроку предоставленному блоку.
26str.each_byte { |fixnum| block }
Передаёт каждый байт str в блок, возвращая каждый байт в десятичном представлении.
27str.each_line(separator=$/) { |substr| block }
Разделяет str, используя аргумент как разделитель записей (по умолчанию — $/), передавая каждую подстроку предоставленному блоку.
28str.empty?
Возвращает true, если str пуста (т.е. имеет длину 0).
29str.eql?(other)
Две строки равны, если они имеют одинаковую длину и содержимое.
30str.gsub(pattern, replacement) [or]
str.gsub(pattern) { |match| block }

Возвращает копию str, в которой все вхождения pattern заменены на replacement или значение блока. pattern обычно является регулярным выражением Regexp; если это String, метасимволы регулярных выражений не интерпретируются (т.е. /\d/ соответствует цифре, а '\d' соответствует обратной косой черте, за которой следует 'd').
31str[fixnum] [или] str[fixnum,fixnum] [или] str[range] [или] str[regexp] [или] str[regexp, fixnum] [или] str[other_str]
Используйте следующие ссылки на параметры для str: если параметр — Fixnum, вернуть кодировку символа fixnum; если параметр — два Fixnum, вернуть подстроку, начинающуюся со смещения (первый fixnum) до длины (второй fixnum); если параметр — диапазон, вернуть подстроку в этом диапазоне; если параметр — регулярное выражение, вернуть часть строки, которая совпадает; если параметр — регулярное выражение с fixnum, вернуть данные совпадения в позиции fixnum; если параметр — other_str, вернуть подстроку, которая совпадает с other_str. Отрицательный Fixnum начинает отсчёт с конца строки с -1.
32str[fixnum] = fixnum [или] str[fixnum] = new_str [или] str[fixnum, fixnum] = new_str [или] str[range] = aString [или] str[regexp] =new_str [или] str[regexp, fixnum] =new_str [или] str[other_str] = new_str ]
Заменить всю строку или часть строки. Синоним slice!.
33str.gsub!(pattern, replacement) [или] str.gsub!(pattern) { |match| block }
Выполнить замены String#gsub, возвращая str, или вернуть nil, если ни одна замена не была выполнена.
34str.hash
Вернуть хеш на основе длины и содержимого строки.
35str.hex
Рассматривать ведущие символы str как строку шестнадцатеричных цифр (необязательный знак и необязательный 0x) и вернуть соответствующее число. Вернуть ноль при ошибке.
36str.include? other_str [или] str.include? fixnum
Вернуть true, если str содержит заданную строку или символ.
37str.index(substring [, offset]) [или]
str.index(fixnum [, offset]) [или]
str.index(regexp [, offset])

Возвращает индекс первого вхождения заданной подстроки, символа (fixnum) или шаблона (regexp) в str. Возвращает nil, если не найдено. Если указан второй параметр, он задаёт позицию в строке, с которой начинать поиск.
38str.insert(index, other_str)
Вставляет other_str перед символом с заданным индексом, изменяя str. Отрицательные значения индекса отсчитываются от конца строки и означают вставку после заданного символа. Подразумевается, что вставка строки начинается с заданного индекса.
39str.inspect
Возвращает пригодную для печати версию str, в которой специальные символы экранированы.
40str.intern [или] str.to_sym
Возвращает символ, соответствующий str, создавая его, если он ранее не существовал.
41str.length
Возвращает длину str. Сравните с size.
42str.ljust(integer, padstr=' ')
Если integer больше длины str, вернуть новую строку длины integer с str, выровненной по левому краю и дополненной padstr. В противном случае вернуть str.
43str.lstrip
Вернуть копию str с удалёнными ведущими пробельными символами.
44str.lstrip!
Удалить ведущие пробельные символы из str или вернуть nil, если изменений нет.
45str.match(pattern)
Если pattern не является регулярным выражением, преобразовать pattern в Regexp, затем вызвать его метод match для str.
46str.oct
Рассматривать ведущие символы str как строку десятичных цифр (необязательный знак) и вернуть соответствующее число. Вернуть 0, если преобразование не удалось.
47str.replace(other_str)
Заменить содержимое str соответствующими значениями из other_str.
48str.reverse
Возвращает новую строку, являющуюся обратной к str.
49str.reverse!
Переворачивает str, изменяя str на месте и возвращая его.
50str.rindex(substring [, fixnum]) [или]
str.rindex(fixnum [, fixnum]) [или]
str.rindex(regexp [, fixnum])

Возвращает индекс последнего вхождения заданной подстроки, символа (fixnum) или шаблона (regexp) в str. Возвращает nil, если вхождение не найдено. Если указан второй параметр, он задаёт позицию в строке, на которой следует завершить поиск. Символы после этой позиции не рассматриваются.
51str.rjust(integer, padstr=' ')
Если integer больше длины str, возвращает новую строку длины integer, в которой str выровнен по правому краю и дополнен padstr. В противном случае возвращает str.
52str.rstrip
Возвращает копию str с удалёнными конечными пробельными символами.
53str.rstrip!
Удаляет завершающие пробельные символы из str или возвращает nil, если изменений нет.
54str.scan(pattern) [или]
str.scan(pattern) { |match, ...| block }

Обе формы сопоставляют pattern (который может быть Regexp или String) с str. Для каждого совпадения создаётся результат, который добавляется в массив результатов или передаётся в блок. Если pattern не содержит групп, каждый отдельный результат состоит из совпавшей строки, $&. Если pattern содержит группы, каждый отдельный результат представляет собой массив, содержащий каждую запись группы.
55str.slice(fixnum) [или] str.slice(fixnum, fixnum) [или]
str.slice(range) [или] str.slice(regexp) [или]
str.slice(regexp, fixnum) [или] str.slice(other_str)
См. str[fixnum] и т. д.
str.slice!(fixnum) [или] str.slice!(fixnum, fixnum) [или] str.slice!(range) [или] str.slice!(regexp) [или] str.slice!(other_str)

Удаляет указанную часть из str и возвращает удалённую часть. Если значение выходит за пределы диапазона, форма с параметром Fixnum вызывает IndexError. Форма с range вызывает RangeError, а формы с Regexp и String игнорируют это действие.
56str.split(pattern=$;, [limit])

Разбить str на подстроки по разделителю и вернуть массив этих подстрок.

Еслиpatternявляется String, то при разбиении str он используется как разделитель. Если pattern — это один пробел, то str разбивается по пробельным символам, игнорируя ведущие пробельные символы и последовательные пробельные символы.

Еслиpatternявляется Regexp, то str разбивается в местах, где pattern совпадает. Когда pattern совпадает со строкой нулевой длины, str разбивается на отдельные символы.

Если параметрpatternопущен, используется значение $;. Если $; равен nil (по умолчанию), str разбивается по пробельным символам, как если бы ` ` был указан в качестве разделителя.

Если параметрlimitопущен, конечные пустые поля подавляются. Если limit — положительное число, возвращается не более этого числа полей (если limit равен 1, вся строка возвращается как единственный элемент массива). Если limit — отрицательное число, количество возвращаемых полей не ограничено, и конечные пустые поля не подавляются.

57str.squeeze([other_str]*)
Создать набор символов из параметров other_str, используя процедуру, описанную для String#count. Вернуть новую строку, в которой одинаковые символы, входящие в набор, заменяются одним символом. Если аргументы не заданы, все одинаковые символы заменяются одним символом.
58str.squeeze!([other_str]*)
То же, что и squeeze, но str изменяется на месте и возвращается, или nil, если изменений нет.
59str.strip
Вернуть копию str с удалёнными ведущими и конечными пробельными символами.
60str.strip!
Удаляет начальные и конечные пробельные символы из str или возвращает nil, если изменений нет.
61str.sub(pattern, replacement) [или]
str.sub(pattern) { |match| block }

Возвращает копию str, в которой первое вхождение pattern заменено на replacement или на значение block. pattern обычно является Regexp; если это String, метасимволы регулярного выражения не интерпретируются.
62str.sub!(pattern, replacement) [или]
str.sub!(pattern) { |match| block }

Выполняет подстановки String#sub и возвращает str или возвращает nil, если ни одна подстановка не была выполнена.
63str.succ [или] str.next
Возвращает преемника str.
64str.succ! [или] str.next!
Эквивалентно String#succ, но str изменяется на месте и возвращается.
65str.sum(n=16)
Возвращает n-битную контрольную сумму символов в str, где n — необязательный параметр Fixnum, по умолчанию 16. Результат — просто сумма двоичных значений каждого символа в str по модулю 2n - 1. Это не особенно хорошая контрольная сумма.
66str.swapcase
Возвращает копию str, в которой все буквы верхнего регистра преобразованы в нижний регистр, а все буквы нижнего регистра — в верхний.
67str.swapcase!
Эквивалентен String#swapcase, но str изменяется на месте и возвращается, или nil, если изменений нет.
68str.to_f
Возвращает результат интерпретации ведущих символов str как числа с плавающей запятой. Дополнительные символы после конца значащих цифр игнорируются. Если в начале str нет допустимого числа, возвращает 0.0. Этот метод не генерирует исключения.
69str.to_i(base=10)
Возвращает результат интерпретации ведущих символов str как целого числа в системе счисления base (основание 2, 8, 10 или 16). Дополнительные символы после конца допустимых цифр игнорируются. Если в начале str нет допустимого числа, возвращает 0. Этот метод не генерирует исключения.
70str.to_s [or] str.to_str
Возвращает получателя.
71str.tr(from_str, to_str)
Возвращает копию str, в которой символы из from_str заменены соответствующими символами из to_str. Если to_str короче from_str, она дополняется своим последним символом. Обе строки могут использовать нотацию c1.c2 для представления диапазонов символов. Если from_str начинается с ^, это означает все символы, кроме перечисленных.
72str.tr!(from_str, to_str)
Эквивалентно String#tr, но str изменяется на месте и возвращается, или nil, если изменений нет.
73str.tr_s(from_str, to_str)
Обрабатывает str согласно правилам, описанным для String#tr, затем удаляет дублирующиеся символы, которые повлияли бы на преобразование.
74str.tr_s!(from_str, to_str)
Эквивалентно String#tr_s, но str изменяется на месте и возвращается, или nil, если изменений нет.
75str.unpack(format)
Декодирует str (который может содержать двоичные данные) согласно строке формата, возвращая массив каждого извлечённого значения. Символы формата состоят из последовательности однобуквенных директив. После каждой директивы может стоять число, указывающее, сколько раз повторить эту директиву. Звёздочка (*) использует все оставшиеся элементы. После директив sSiIlL может стоять знак подчёркивания (_), чтобы использовать собственный размер базовой платформы для указанного типа; в противном случае используется независимый от платформы согласованный размер. Пробельные символы в строке формата игнорируются.
76str.upcase
Возвращает копию str, в которой все строчные буквы заменены прописными. Операция не зависит от окружения; затрагиваются только символы от a до z.
77str.upcase!
Изменить содержимое str на верхний регистр или вернуть nil, если изменений нет.
78str.upto(other_str) { |s| block }
Перебирать последовательные значения, начиная с str и заканчивая other_str (включительно), передавая каждое значение по очереди в блок. Для генерации каждого значения используется метод String#succ.

Директивы распаковки String

В следующей таблице перечислены директивы распаковки для метода String#unpack.

ИнструкцияReturnОписание
AStringУдалить завершающие нулевые символы и пробелы.
aStringString.
BStringИзвлечь биты из каждого символа (сначала старший бит).
bStringИзвлечь биты из каждого символа (сначала младший бит).
CFixnumИзвлечь символ как беззнаковое целое число.
cFixnumИзвлечь символ как целое число.
D, dFloatРассматривать sizeof(double) символов как нативный double.
EFloatИнтерпретировать sizeof(double) символов как double с порядком байтов little-endian.
eFloatИнтерпретировать sizeof(float) символов как float с порядком байтов little-endian.
F, fFloatИнтерпретировать sizeof(float) символов как float в собственном формате.
GFloatИнтерпретировать sizeof(double) символов как double в сетевом порядке байтов.
gFloatИнтерпретировать sizeof(float) символов как float в сетевом порядке байтов.
HStringИзвлекать шестнадцатеричные значения из каждого символа (сначала старшие разряды).
hStringИзвлекать шестнадцатеричные значения из каждого символа (сначала младшие разряды).
IIntegerИнтерпретировать sizeof(int) следующих подряд символов (длина изменяется с помощью _) как целое число в собственном формате.
iIntegerИнтерпретировать sizeof(int) следующих подряд символов (длина изменяется с помощью _) как знаковое целое число в собственном формате.
LIntegerИнтерпретировать четыре (изменяется с помощью _) последовательных символа как беззнаковое длинное целое число в собственном формате.
lIntegerИнтерпретировать четыре (изменяется с помощью _) последовательных символа как знаковое длинное целое число в собственном формате.
MStringQuoted-printable.
mStringКодирование Base64.
NIntegerОбрабатывать четыре символа как unsigned long в сетевом порядке байтов.
nFixnumОбрабатывать два символа как unsigned short в сетевом порядке байтов.
PStringОбрабатывать sizeof(char *) символов как указатель и вернуть \emph{len} символов из указанного местоположения.
pStringОбрабатывать sizeof(char *) символов как указатель на строку символов, завершённую null.
QIntegerОбрабатывать восемь символов как unsigned quad word (64-bit).
qIntegerОбрабатывать восемь символов как signed quad word (64-bit).
SFixnumОбрабатывать два последовательных символа (разные, если используется _) как unsigned short в собственном порядке байтов.
sFixnumОбрабатывать два последовательных символа (разные, если используется _) как signed short в собственном порядке байтов.
UIntegerСимвол UTF-8 как unsigned integer.
uStringUU-кодирование.
VFixnumОбрабатывать четыре символа как unsigned long в порядке байтов little-endian.
vFixnumРассматривать два символа как unsigned short в порядке байтов little-endian.
wIntegerЦелое число, сжатое по BER.
X Пропустить один символ назад.
x Пропустить один символ вперёд.
ZStringИспользуется с *, удаляет конечные null-символы до первого null.
@ Пропустить смещение, заданное параметром длины.

Примеры

Попробуйте следующие примеры для распаковки различных данных.

"abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "] "abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"] "abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "] "aa".unpack('b8B8') #=> ["10000110", "01100001"] "aaa".unpack('h2H2c') #=> ["16", "61", 97] "\xfe\xff\xfe\xff".unpack('sS') #=> [-2, 65534] "now=20is".unpack('M*') #=> ["now is"] "whole".unpack('xax2aX2aX1aX2a') #=> ["h", "e", "l", "l", "o"]
Другие расширения