Ruby Строка
В Ruby объекты String используются для хранения или обработки последовательностей из одного или нескольких байтов.
Строки Ruby делятся на строки в одинарных кавычках (') и строки в двойных кавычках ("). Разница в том, что строки в двойных кавычках поддерживают больше экранирующих символов.
Строки в одинарных кавычках
Простейшие строки — это строки в одинарных кавычках, то есть строки, заключённые в одинарные кавычки:
Если вам нужно использовать символ одинарной кавычки внутри строки в одинарных кавычках, нужно использовать обратную косую черту (\) внутри строки в одинарных кавычках, чтобы интерпретатор Ruby не рассматривал этот символ одинарной кавычки как завершение строки:
Обратная косая черта также может экранировать другую обратную косую черту, так что вторая обратная косая черта сама не интерпретируется как экранирующий символ.
Ниже приведены возможности, связанные со строками в Ruby.
Строки в двойных кавычках
В строках в двойных кавычках мы можем использовать#{}знак решётки и фигурные скобки для вычисления выражений:
Встраивание переменных в строки:
Примеры
Попробуйте »
Приведённый выше пример выводит следующий результат:
你好 Joe, Mary 在哪?
Выполнение математических операций в строках:
Примеры
Попробуйте »
Приведённый выше пример выводит следующий результат:
x 的值为 12 x + y 的值为 48 x + y + z 的平均值为 40
Ruby также поддерживает строковые литералы, вводимые с помощью %q и %Q. %q использует правила заключения в одинарные кавычки, а %Q — правила заключения в двойные кавычки; после них идёт начальный разделитель, такой как ( ! [ { и т. д., и соответствующий конечный разделитель, такой как } ] ).
Символ, следующий за q или Q, является разделителем. Разделителем может быть любой неалфавитно-цифровой однобайтовый символ, например [, {, (, <, !, и т. д. Строка читается до тех пор, пока не будет найден соответствующий закрывающий разделитель.
Примеры
Попробуйте »
Приведённый выше пример выводит следующий результат:
Ruby 的字符串可以使用 '' 和 ""。 Ruby 的字符串可以使用 '' 和 ""。
Экранирующие символы
В таблице ниже перечислены escape-символы или непечатаемые символы, которые можно экранировать с помощью нотации с обратной косой чертой.
Примечание:Внутри строки в двойных кавычках escape-символы обрабатываются. Внутри строки в одинарных кавычках escape-символы не обрабатываются и выводятся как есть.
| Нотация с обратной косой чертой | Шестнадцатеричный символ | Описание |
|---|---|---|
| \a | 0x07 | Оповещение (звонок) |
| \b | 0x08 | Возврат на один символ |
| \cx | Control-x | |
| \C-x | Control-x | |
| \e | 0x1b | Escape |
| \f | 0x0c | Подача страницы |
| \M-\C-x | Meta-Control-x | |
| \n | 0x0a | Перевод строки |
| \nnn | Восьмеричное представление, где n принимает значения от 0 до 7 | |
| \r | 0x0d | Возврат каретки |
| \s | 0x20 | Память |
| \t | 0x09 | Вкладка |
| \v | 0x0b | Вертикальная табуляция |
| \x | Символ x | |
| \xnn | Шестнадцатеричное представление, где n находится в диапазоне 0-9, a-f или A-F |
Кодировка символов
Набор символов по умолчанию в Ruby — ASCII, где символы могут быть представлены одним байтом. Если вы используете UTF-8 или другой современный набор символов, символы могут быть представлены от одного до четырёх байтов.
Вы можете использовать $KCODE в начале программы, чтобы изменить набор символов, как показано ниже:
$KCODE = 'u'
Ниже приведены возможные значения $KCODE.
| Кодирование | Описание |
|---|---|
| a | ASCII (то же, что none). Это значение по умолчанию. |
| e | EUC. |
| n | None (то же, что ASCII). |
| u | UTF-8. |
Встроенные методы строк
Нам нужен экземпляр объекта String, чтобы вызывать методы String. Ниже показано, как создать экземпляр объекта String:
Это вернёт новый строковый объект, содержащийstrкопию. Теперь, используяstrобъект, мы можем вызвать любой доступный метод экземпляра. Например:
Примеры
Это даст следующий результат:
this is test
Ниже перечислены публичные методы строк (при условии, что str — объект String):
| Нет. | Метод и описание |
|---|---|
| 1 | str % arg Форматирует строку с использованием спецификации формата. Если arg содержит более одной подстановки, то arg должен быть массивом. Дополнительные сведения о спецификациях формата см. в описании sprintf в модуле Kernel. |
| 2 | str * integer Возвращает новую строку, содержащую integer копий str. Иными словами, str повторяется integer раз. |
| 3 | str + other_str Присоединяет other_str к str. |
| 4 | str << obj Присоединяет объект к строке. Если объект является Fixnum со значением от 0 до 255, он преобразуется в символ. Сравните это с concat. |
| 5 | str <=> other_str Сравнивает str с other_str, возвращая -1 (меньше), 0 (равно) или 1 (больше). Сравнение учитывает регистр. |
| 6 | str == obj Проверяет равенство str и obj. Если obj не является строкой, возвращает false; если str <=> obj возвращает 0, возвращает true. |
| 7 | str =~ obj Сопоставляет str с шаблоном регулярного выражения obj. Возвращает позицию, с которой начинается совпадение, иначе возвращает false. |
| 8 | str[position] # Примечание: возвращает код ASCII, а не символ str[start, length] str[start..end] str[start...end] Извлекает подстроку по индексу. |
| 9 | str.capitalize Преобразует первую букву строки в верхний регистр, а остальные — в нижний для отображения. |
| 10 | str.capitalize! То же, что capitalize, но capitalize! возвращает nil, если изменения не вносятся. |
| 11 | str.casecmp Сравнение строк без учёта регистра. |
| 12 | str.center Центрирует строку. |
| 13 | str.chomp Удаляет разделитель записей ($/) из конца строки, обычно \n. Если разделителя записей нет, ничего не делает. |
| 14 | str.chomp! То же, что и chomp, но str изменяется и возвращается. |
| 15 | str.chop Удаляет последний символ из str. |
| 16 | str.chop! То же, что и chop, но str изменяется и возвращается. |
| 17 | str.concat(other_str) Присоединяет other_str к str. |
| 18 | str.count(str, ...) Подсчитывает один или несколько наборов символов. Если наборов символов несколько, подсчитывает пересечение этих наборов. |
| 19 | str.crypt(other_str) Применяет односторонний криптографический хеш к str. Аргумент — строка длиной в два символа, каждый символ в диапазоне a-z, A-Z, 0-9, ., или /. |
| 20 | str.delete(other_str, ...) Возвращает копию str, в которой удалены все символы, входящие в пересечение аргументов. |
| 21 | str.delete!(other_str, ...) То же, что delete, но str изменяется и возвращается. |
| 22 | str.downcase Возвращает копию str, в которой все прописные буквы заменены строчными. |
| 23 | str.downcase! То же, что downcase, но str изменяется и возвращается. |
| 24 | str.dump Возвращает версию str, в которой все непечатаемые символы заменены на нотацию \nnn, а все специальные символы экранированы. |
| 25 | str.each(separator=$/) { |substr| block } Разделяет str, используя аргумент как разделитель записей (по умолчанию — $/), передавая каждую подстроку предоставленному блоку. |
| 26 | str.each_byte { |fixnum| block } Передаёт каждый байт str в блок, возвращая каждый байт в десятичном представлении. |
| 27 | str.each_line(separator=$/) { |substr| block } Разделяет str, используя аргумент как разделитель записей (по умолчанию — $/), передавая каждую подстроку предоставленному блоку. |
| 28 | str.empty? Возвращает true, если str пуста (т.е. имеет длину 0). |
| 29 | str.eql?(other) Две строки равны, если они имеют одинаковую длину и содержимое. |
| 30 | str.gsub(pattern, replacement) [or] str.gsub(pattern) { |match| block } Возвращает копию str, в которой все вхождения pattern заменены на replacement или значение блока. pattern обычно является регулярным выражением Regexp; если это String, метасимволы регулярных выражений не интерпретируются (т.е. /\d/ соответствует цифре, а '\d' соответствует обратной косой черте, за которой следует 'd'). |
| 31 | str[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. |
| 32 | str[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!. |
| 33 | str.gsub!(pattern, replacement) [или] str.gsub!(pattern) { |match| block } Выполнить замены String#gsub, возвращая str, или вернуть nil, если ни одна замена не была выполнена. |
| 34 | str.hash Вернуть хеш на основе длины и содержимого строки. |
| 35 | str.hex Рассматривать ведущие символы str как строку шестнадцатеричных цифр (необязательный знак и необязательный 0x) и вернуть соответствующее число. Вернуть ноль при ошибке. |
| 36 | str.include? other_str [или] str.include? fixnum Вернуть true, если str содержит заданную строку или символ. |
| 37 | str.index(substring [, offset]) [или] str.index(fixnum [, offset]) [или] str.index(regexp [, offset]) Возвращает индекс первого вхождения заданной подстроки, символа (fixnum) или шаблона (regexp) в str. Возвращает nil, если не найдено. Если указан второй параметр, он задаёт позицию в строке, с которой начинать поиск. |
| 38 | str.insert(index, other_str) Вставляет other_str перед символом с заданным индексом, изменяя str. Отрицательные значения индекса отсчитываются от конца строки и означают вставку после заданного символа. Подразумевается, что вставка строки начинается с заданного индекса. |
| 39 | str.inspect Возвращает пригодную для печати версию str, в которой специальные символы экранированы. |
| 40 | str.intern [или] str.to_sym Возвращает символ, соответствующий str, создавая его, если он ранее не существовал. |
| 41 | str.length Возвращает длину str. Сравните с size. |
| 42 | str.ljust(integer, padstr=' ') Если integer больше длины str, вернуть новую строку длины integer с str, выровненной по левому краю и дополненной padstr. В противном случае вернуть str. |
| 43 | str.lstrip Вернуть копию str с удалёнными ведущими пробельными символами. |
| 44 | str.lstrip! Удалить ведущие пробельные символы из str или вернуть nil, если изменений нет. |
| 45 | str.match(pattern) Если pattern не является регулярным выражением, преобразовать pattern в Regexp, затем вызвать его метод match для str. |
| 46 | str.oct Рассматривать ведущие символы str как строку десятичных цифр (необязательный знак) и вернуть соответствующее число. Вернуть 0, если преобразование не удалось. |
| 47 | str.replace(other_str) Заменить содержимое str соответствующими значениями из other_str. |
| 48 | str.reverse Возвращает новую строку, являющуюся обратной к str. |
| 49 | str.reverse! Переворачивает str, изменяя str на месте и возвращая его. |
| 50 | str.rindex(substring [, fixnum]) [или] str.rindex(fixnum [, fixnum]) [или] str.rindex(regexp [, fixnum]) Возвращает индекс последнего вхождения заданной подстроки, символа (fixnum) или шаблона (regexp) в str. Возвращает nil, если вхождение не найдено. Если указан второй параметр, он задаёт позицию в строке, на которой следует завершить поиск. Символы после этой позиции не рассматриваются. |
| 51 | str.rjust(integer, padstr=' ') Если integer больше длины str, возвращает новую строку длины integer, в которой str выровнен по правому краю и дополнен padstr. В противном случае возвращает str. |
| 52 | str.rstrip Возвращает копию str с удалёнными конечными пробельными символами. |
| 53 | str.rstrip! Удаляет завершающие пробельные символы из str или возвращает nil, если изменений нет. |
| 54 | str.scan(pattern) [или] str.scan(pattern) { |match, ...| block } Обе формы сопоставляют pattern (который может быть Regexp или String) с str. Для каждого совпадения создаётся результат, который добавляется в массив результатов или передаётся в блок. Если pattern не содержит групп, каждый отдельный результат состоит из совпавшей строки, $&. Если pattern содержит группы, каждый отдельный результат представляет собой массив, содержащий каждую запись группы. |
| 55 | str.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 игнорируют это действие. |
| 56 | str.split(pattern=$;, [limit]) Разбить str на подстроки по разделителю и вернуть массив этих подстрок. Еслиpatternявляется String, то при разбиении str он используется как разделитель. Если pattern — это один пробел, то str разбивается по пробельным символам, игнорируя ведущие пробельные символы и последовательные пробельные символы. Еслиpatternявляется Regexp, то str разбивается в местах, где pattern совпадает. Когда pattern совпадает со строкой нулевой длины, str разбивается на отдельные символы. Если параметрpatternопущен, используется значение $;. Если $; равен nil (по умолчанию), str разбивается по пробельным символам, как если бы ` ` был указан в качестве разделителя. Если параметрlimitопущен, конечные пустые поля подавляются. Если limit — положительное число, возвращается не более этого числа полей (если limit равен 1, вся строка возвращается как единственный элемент массива). Если limit — отрицательное число, количество возвращаемых полей не ограничено, и конечные пустые поля не подавляются. |
| 57 | str.squeeze([other_str]*) Создать набор символов из параметров other_str, используя процедуру, описанную для String#count. Вернуть новую строку, в которой одинаковые символы, входящие в набор, заменяются одним символом. Если аргументы не заданы, все одинаковые символы заменяются одним символом. |
| 58 | str.squeeze!([other_str]*) То же, что и squeeze, но str изменяется на месте и возвращается, или nil, если изменений нет. |
| 59 | str.strip Вернуть копию str с удалёнными ведущими и конечными пробельными символами. |
| 60 | str.strip! Удаляет начальные и конечные пробельные символы из str или возвращает nil, если изменений нет. |
| 61 | str.sub(pattern, replacement) [или] str.sub(pattern) { |match| block } Возвращает копию str, в которой первое вхождение pattern заменено на replacement или на значение block. pattern обычно является Regexp; если это String, метасимволы регулярного выражения не интерпретируются. |
| 62 | str.sub!(pattern, replacement) [или] str.sub!(pattern) { |match| block } Выполняет подстановки String#sub и возвращает str или возвращает nil, если ни одна подстановка не была выполнена. |
| 63 | str.succ [или] str.next Возвращает преемника str. |
| 64 | str.succ! [или] str.next! Эквивалентно String#succ, но str изменяется на месте и возвращается. |
| 65 | str.sum(n=16) Возвращает n-битную контрольную сумму символов в str, где n — необязательный параметр Fixnum, по умолчанию 16. Результат — просто сумма двоичных значений каждого символа в str по модулю 2n - 1. Это не особенно хорошая контрольная сумма. |
| 66 | str.swapcase Возвращает копию str, в которой все буквы верхнего регистра преобразованы в нижний регистр, а все буквы нижнего регистра — в верхний. |
| 67 | str.swapcase! Эквивалентен String#swapcase, но str изменяется на месте и возвращается, или nil, если изменений нет. |
| 68 | str.to_f Возвращает результат интерпретации ведущих символов str как числа с плавающей запятой. Дополнительные символы после конца значащих цифр игнорируются. Если в начале str нет допустимого числа, возвращает 0.0. Этот метод не генерирует исключения. |
| 69 | str.to_i(base=10) Возвращает результат интерпретации ведущих символов str как целого числа в системе счисления base (основание 2, 8, 10 или 16). Дополнительные символы после конца допустимых цифр игнорируются. Если в начале str нет допустимого числа, возвращает 0. Этот метод не генерирует исключения. |
| 70 | str.to_s [or] str.to_str Возвращает получателя. |
| 71 | str.tr(from_str, to_str) Возвращает копию str, в которой символы из from_str заменены соответствующими символами из to_str. Если to_str короче from_str, она дополняется своим последним символом. Обе строки могут использовать нотацию c1.c2 для представления диапазонов символов. Если from_str начинается с ^, это означает все символы, кроме перечисленных. |
| 72 | str.tr!(from_str, to_str) Эквивалентно String#tr, но str изменяется на месте и возвращается, или nil, если изменений нет. |
| 73 | str.tr_s(from_str, to_str) Обрабатывает str согласно правилам, описанным для String#tr, затем удаляет дублирующиеся символы, которые повлияли бы на преобразование. |
| 74 | str.tr_s!(from_str, to_str) Эквивалентно String#tr_s, но str изменяется на месте и возвращается, или nil, если изменений нет. |
| 75 | str.unpack(format) Декодирует str (который может содержать двоичные данные) согласно строке формата, возвращая массив каждого извлечённого значения. Символы формата состоят из последовательности однобуквенных директив. После каждой директивы может стоять число, указывающее, сколько раз повторить эту директиву. Звёздочка (*) использует все оставшиеся элементы. После директив sSiIlL может стоять знак подчёркивания (_), чтобы использовать собственный размер базовой платформы для указанного типа; в противном случае используется независимый от платформы согласованный размер. Пробельные символы в строке формата игнорируются. |
| 76 | str.upcase Возвращает копию str, в которой все строчные буквы заменены прописными. Операция не зависит от окружения; затрагиваются только символы от a до z. |
| 77 | str.upcase! Изменить содержимое str на верхний регистр или вернуть nil, если изменений нет. |
| 78 | str.upto(other_str) { |s| block } Перебирать последовательные значения, начиная с str и заканчивая other_str (включительно), передавая каждое значение по очереди в блок. Для генерации каждого значения используется метод String#succ. |
Директивы распаковки String
В следующей таблице перечислены директивы распаковки для метода String#unpack.
| Инструкция | Return | Описание |
|---|---|---|
| A | String | Удалить завершающие нулевые символы и пробелы. |
| a | String | String. |
| B | String | Извлечь биты из каждого символа (сначала старший бит). |
| b | String | Извлечь биты из каждого символа (сначала младший бит). |
| C | Fixnum | Извлечь символ как беззнаковое целое число. |
| c | Fixnum | Извлечь символ как целое число. |
| D, d | Float | Рассматривать sizeof(double) символов как нативный double. |
| E | Float | Интерпретировать sizeof(double) символов как double с порядком байтов little-endian. |
| e | Float | Интерпретировать sizeof(float) символов как float с порядком байтов little-endian. |
| F, f | Float | Интерпретировать sizeof(float) символов как float в собственном формате. |
| G | Float | Интерпретировать sizeof(double) символов как double в сетевом порядке байтов. |
| g | Float | Интерпретировать sizeof(float) символов как float в сетевом порядке байтов. |
| H | String | Извлекать шестнадцатеричные значения из каждого символа (сначала старшие разряды). |
| h | String | Извлекать шестнадцатеричные значения из каждого символа (сначала младшие разряды). |
| I | Integer | Интерпретировать sizeof(int) следующих подряд символов (длина изменяется с помощью _) как целое число в собственном формате. |
| i | Integer | Интерпретировать sizeof(int) следующих подряд символов (длина изменяется с помощью _) как знаковое целое число в собственном формате. |
| L | Integer | Интерпретировать четыре (изменяется с помощью _) последовательных символа как беззнаковое длинное целое число в собственном формате. |
| l | Integer | Интерпретировать четыре (изменяется с помощью _) последовательных символа как знаковое длинное целое число в собственном формате. |
| M | String | Quoted-printable. |
| m | String | Кодирование Base64. |
| N | Integer | Обрабатывать четыре символа как unsigned long в сетевом порядке байтов. |
| n | Fixnum | Обрабатывать два символа как unsigned short в сетевом порядке байтов. |
| P | String | Обрабатывать sizeof(char *) символов как указатель и вернуть \emph{len} символов из указанного местоположения. |
| p | String | Обрабатывать sizeof(char *) символов как указатель на строку символов, завершённую null. |
| Q | Integer | Обрабатывать восемь символов как unsigned quad word (64-bit). |
| q | Integer | Обрабатывать восемь символов как signed quad word (64-bit). |
| S | Fixnum | Обрабатывать два последовательных символа (разные, если используется _) как unsigned short в собственном порядке байтов. |
| s | Fixnum | Обрабатывать два последовательных символа (разные, если используется _) как signed short в собственном порядке байтов. |
| U | Integer | Символ UTF-8 как unsigned integer. |
| u | String | UU-кодирование. |
| V | Fixnum | Обрабатывать четыре символа как unsigned long в порядке байтов little-endian. |
| v | Fixnum | Рассматривать два символа как unsigned short в порядке байтов little-endian. |
| w | Integer | Целое число, сжатое по BER. |
| X | Пропустить один символ назад. | |
| x | Пропустить один символ вперёд. | |
| Z | String | Используется с *, удаляет конечные null-символы до первого null. |
| @ | Пропустить смещение, заданное параметром длины. |
Примеры
Попробуйте следующие примеры для распаковки различных данных.