English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby базовый курс

Ruby продвинутый курс

Строки (String) в Ruby

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

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

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

Самый простой тип строки - это строка с одинарными кавычками, где строка хранится в одинарных кавычках:

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

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

'Won\'t you read O\'Reilly\'s book?'

反斜杠也能转义另一个反斜杠,这样第二个反斜杠本身不会解释为转义字符。

Ниже приведены характеристики строк в 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.

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

Символ обратной косой чертыСимвол шестнадцатеричной системы счисленияDescription
\a0x07Сигнальный символ
\b0x08Клавиша Backspace
\cx Control-x
\C-x Control-x
\e0x1bСимвол Escape
\f0x0cПеренос страницы
\M-\C-x Meta-Control-x
\n0x0aПеренос строки
\nnn Оctalное представление, где диапазон n составляет 0.7
\r0x0dВозврат каретки
\s0x20Пробел
\t0x09Табуляция
\v0x0bВертикальная табуляция
\x Символ x
\xnn Шестнадцатеричное представление, где n варьируется от 0x до 0x9, a.f или A.F

Кодирование символов

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

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

$KCODE = 'u'

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

КодированиеDescription
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.
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, то возвращает true, возвращает 0.
7str =~ obj
7
str =~ objСоответствовать шаблону регулярного выражения obj в str. Возвращает позицию начала соответствия, в противном случае возвращает false.
8
str[position] # Обратите внимание, что возвращается ASCII-код, а не символ
str[start, length]

str[start..end]
str[start...end]Использовать индекс для вырезания подстроки
9
str.capitalizeПреобразовать строку в верхний регистр.
10
str.capitalize!Как и capitalize, но str изменяется и возвращает.
11
str.casecmpНе различать строчные и прописные буквы при сравнении строк.
str.center
Центрировать строку.13
str.chomp
Удалить из строки символы разделителя строк ($/), обычно \n. Если разделитель строк отсутствует, не выполняется никакие действия.14
str.chomp!
Как и chomp, но str изменяется и возвращает.str.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?
Если str пуст (т.е. длина 0), то возвращает true.
29str.eql?(other)
Если две строки имеют одинаковую длину и содержимое, то эти строки равны.
30str.gsub(pattern, replacement) [или]
str.gsub(pattern) { |match| block }

Возвращает копию str, все的出现 pattern заменяются replacement или значением block.
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 [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] =new_str [or] str[regexp, fixnum] =new_str [or] str[other_str] = new_str ]
Заменяет всю строку или часть строки. Синоним slice!.
33str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match| block }
Выполняет замену с помощью String#gsub, возвращает str, если не было выполнено ни одной замены, то возвращает nil.
34str.hash
Возвращает хеш, основанный на длине и содержимом строки.
35str.hex
Считывает начальные символы строки str как строку шестнадцатеричных чисел (опциональный символ и опциональное 0x) и возвращает соответствующее число. Возвращает ноль при ошибке.
36str.include? other_str [or] str.include? fixnum
Возвращает true, если строка str содержит заданную строку или символ.
37str.index(substring [, offset]) [or]
str.index(fixnum [, offset]) [or]
str.index(regexp [, offset])

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

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

Два формата соответствия pattern (может быть регулярным выражением Regexp или строкой String) итерируют по str. Для каждого соответствия создается результат, который добавляется в массив результатов или передается в block. Если 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 generates an IndexError. При использовании параметра в виде range generates a RangeError, при использовании Regexp и String действие будет пропущено.
56str.split(pattern=$;, [limit])

На основе разделителя разбивает строку str на подстроки и возвращает массив этих подстрок.

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

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

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

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

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

Возвращает копию строки str, где первое вхождение шаблона pattern заменяется значением replacement или block. Шаблон pattern обычно является регулярным выражением Regexp; если это строка String, то регулярные символы не интерпретируются.
62str.sub!(pattern, replacement) [or]
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-bit контрольную сумму символов 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 как целого числа с основанием (основание 2, 8, 10 или 16). Избыточные символы за концом действительного числа игнорируются. Если в начале str нет действительного числа, то возвращается 0. Этот метод не генерирует исключения.
70str.to_s [или] str.to_str
Возвращает переданное значение.
71str.tr(from_str, to_str)
Возвращает копию str, где символы из from_str заменяются соответствующими символами из to_str. Если to_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)
Equivalent to String#tr_s, but str will change and return, or return nil if there is no change.
75str.unpack(format)
Decode str according to the format string (may contain binary data), and return an array of each extracted value. The format character consists of a series of single-character instructions. A number can follow each instruction, indicating the number of times to repeat the instruction. An asterisk (*) will use all remaining elements. Instructions sSiIlL may follow an underscore (_) to use the local size size of the underlying platform for the specified type, otherwise, a consistent size size independent of the platform is used. Spaces in the format string are ignored.
76str.upcase
Return a copy of str with all lowercase letters replaced with uppercase letters. The operation is case-insensitive, only characters a to z are affected.
77str.upcase!
Change the content of str to uppercase, if there is no change then return nil.
78str.upto(other_str) { |s| block }
Traverse consecutive values starting with str, ending with other_str (inclusive), alternating each value to the block. The String#succ method is used to generate each value.

String unpack command

The following table lists the unpacking commands of the String#unpack method.

CommandReturnDescription
AStringRemove trailing null and spaces.
aStringString.
BStringExtract bits from each character (first the most significant bit).
bStringExtract bits from each character (first the least significant bit).
CFixnumExtract a character as an unsigned integer.
cFixnumExtract a character as an integer.
D, dFloatTake characters of length sizeof(double) as native double.
EFloatTake characters of length sizeof(double) as littleendian byte order double.
eFloatTake characters of length sizeof(float) as littleendian byte order float.
F, fFloatTake characters of length sizeof(float) as native float.
GFloatTake characters of length sizeof(double) as double in network byte order.
gFloatTake characters of length sizeof(float) as float in network byte order.
HStringизвлечь шестнадцатеричное из каждого символа (в首先是 наибольший значащий бит).
hStringизвлечь шестнадцатеричное из каждого символа (в首先是 наименьший значащий бит).
IIntegerвзять последовательные символы длины sizeof(int) (измененные через _) как native integer.
iIntegerвзять последовательные символы длины sizeof(int) (измененные через _) как signed native integer.
LIntegerвзять четыре (измененные через _) последовательных символа как unsigned native long integer.
lIntegerвзять четыре (измененные через _) последовательных символа как signed native long integer.
MStringцитировать printable.
mStringBase64 кодирование.
NIntegerвзять четыре символа как unsigned long в порядке network.
nFixnumвзять два символа как unsigned short в порядке network.
PStringвзять символы длины sizeof(char *) как указатель, и вернуться \emph{len} символов от указанного места.
pStringвзять символы длины sizeof(char *) как указатель на символ с null-терминатором.
QIntegerвзять восемь символов как unsigned quad word (64 бита).
qIntegerвзять восемь символов как signed quad word (64 бита).
SFixnumвзять два (если используется _, то отличные) последовательных символа как unsigned short в порядке native.
sFixnumвзять два (если используется _, то отличные) последовательных символа как signed short в порядке native.
UIntegerUTF-8 символ, как unsigned integer.
uStringUU кодирование.
VFixnumвзять четыре символа как unsigned long в порядке little-endian.
vFixnumвзять два символа как unsigned short в порядке little-endian.
wIntegerBER сжатый целое число.
X перейти на один символ назад.
x перейти на один символ вперед.
ZStringиспользовать вместе с *, чтобы удалить следущие null до первого null.
@ пропустить параметр offset, указанный значением length.

онлайн пример

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

"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"]