Ruby Cadena (String)

El objeto String en Ruby se utiliza para almacenar o manipular secuencias de uno o más bytes.

Las cadenas de Ruby se dividen en cadenas con comillas simples (') y cadenas con comillas dobles ("); la diferencia es que las cadenas con comillas dobles pueden admitir más caracteres de escape.

Cadenas con comillas simples

La cadena más simple es la cadena con comillas simples, es decir, almacenar la cadena entre comillas simples:

'Esta es la cadena de un programa Ruby'

Si necesita usar caracteres de comillas simples dentro de una cadena con comillas simples, entonces debe usar una barra invertida (\) dentro de la cadena con comillas simples, para que el intérprete de Ruby no considere este carácter de comilla simple como el símbolo de terminación de la cadena:

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

La barra invertida también puede escapar otra barra invertida, de modo que la segunda barra invertida no se interpretará como un carácter de escape.

A continuación se presentan las características relacionadas con las cadenas en Ruby.

Cadenas con comillas dobles

En las cadenas con comillas dobles podemos usar#{}el signo de almohadilla (#) y las llaves ({}) para calcular el valor de expresiones:

Incrustar variables en cadenas:

Ejemplo

#!/usr/bin/ruby # -*- coding: UTF-8 -*- name1 = "Joe" name2 = "Mary" puts "Hola #{name1}, ¿dónde está #{name2}?"

Pruébalo »

El resultado de ejecutar el ejemplo anterior es:

你好 Joe,  Mary 在哪?

Realizar operaciones matemáticas en cadenas:

Ejemplo

#!/usr/bin/ruby # -*- coding: UTF-8 -*- x, y, z = 12, 36, 72 puts "El valor de x es #{ x }" puts "El valor de x + y es #{ x + y }" puts "El promedio de x + y + z es #{ (x + y + z)/3 }"

Pruébalo »

El resultado de ejecutar el ejemplo anterior es:

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

Ruby también admite variables de cadena introducidas con %q y %Q. %q usa las reglas de comillas simples, mientras que %Q usa las reglas de comillas dobles, seguidas de un delimitador de apertura como (!, [, {, etc.) y un delimitador de cierre como (}, ], ), etc.).

El carácter que sigue a q o Q es el delimitador. El delimitador puede ser cualquier carácter de un solo byte que no sea alfanumérico, como [, {, (, <, !, etc. La cadena se leerá hasta que se encuentre el delimitador de cierre correspondiente.

Ejemplo

#!/usr/bin/ruby # -*- coding: UTF-8 -*- desc1 = %Q{Las cadenas de Ruby pueden usar '' y "".} desc2 = %q|Las cadenas de Ruby pueden usar '' y "".| puts desc1 puts desc2

Pruébalo »

El resultado de ejecutar el ejemplo anterior es:

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

Caracteres de escape

La siguiente tabla enumera los caracteres de escape o caracteres no imprimibles que se pueden escapar con el símbolo de barra invertida.

Nota:Dentro de una cadena entre comillas dobles, los caracteres de escape se interpretan. Dentro de una cadena entre comillas simples, los caracteres de escape no se interpretan y se muestran tal cual.

Símbolo de barra invertidaCarácter hexadecimalDescripción
\a0x07Carácter de alarma
\b0x08Tecla de retroceso
\cx Control-x
\C-x Control-x
\e0x1bCarácter de escape
\f0x0cAvance de página
\M-\C-x Meta-Control-x
\n0x0aNueva línea
\nnn Notación octal, donde n está en el rango de 0 a 7.
\r0x0dRetorno de carro
\s0x20Espacio
\t0x09Tabulación
\v0x0bTabulación vertical
\x Carácter x
\xnn Notación hexadecimal, donde n está en el rango de 0-9, a-f o A-F.

Codificación de caracteres

El conjunto de caracteres predeterminado de Ruby es ASCII, y los caracteres pueden representarse con un solo byte. Si utiliza UTF-8 u otro conjunto de caracteres moderno, los caracteres pueden representarse con uno a cuatro bytes.

Puede cambiar el conjunto de caracteres al comienzo del programa usando $KCODE, como se muestra a continuación:

$KCODE = 'u'

A continuación se muestran los posibles valores de $KCODE.

CodificaciónDescripción
aASCII (igual que none). Este es el predeterminado.
eEUC.
nNone (igual que ASCII).
uUTF-8.

Métodos integrados de cadenas

Necesitamos tener una instancia del objeto String para llamar a los métodos de String. A continuación se muestra la forma de crear una instancia del objeto String:

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

Esto devolverá un nuevo objeto de cadena que contiene unastrcopia del nuevo objeto de cadena. Ahora, usando elstrobjeto, podemos llamar a cualquier método de instancia disponible. Por ejemplo:

Ejemplo

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

Esto producirá el siguiente resultado:

this is test

A continuación se presentan los métodos de cadena públicos (suponiendo que str es un objeto String):

N.ºMétodo y descripción
1str % arg
Formatea una cadena usando especificaciones de formato. Si arg contiene más de una sustitución, arg debe ser un arreglo. Para obtener más información sobre las especificaciones de formato, consulte sprintf en el 'Módulo Kernel'.
2str * integer
Devuelve una nueva cadena que contiene integer copias de str. En otras palabras, str se repite integer veces.
3str + other_str
Concatena other_str a str.
4str << obj
Concatena un objeto a la cadena. Si el objeto es un número fijo Fixnum entre 0 y 255, se convertirá en un carácter. Compárelo con concat.
5str <=> other_str
Compara str con other_str y devuelve -1 (menor que), 0 (igual) o 1 (mayor que). La comparación distingue entre mayúsculas y minúsculas.
6str == obj
Comprueba la igualdad de str y obj. Si obj no es una cadena, devuelve false; si str <=> obj devuelve 0, devuelve true.
7str =~ obj
Coincide str con el patrón de expresión regular obj. Devuelve la posición donde comienza la coincidencia; de lo contrario, devuelve false.
8str[position] # tenga en cuenta que devuelve el código ASCII, no el carácter
str[start, length]
str[start..end]
str[start...end]

Extraer subcadenas usando índice.
9str.capitalize
Convierte la primera letra de la cadena a mayúscula y el resto a minúsculas.
10str.capitalize!
Igual que capitalize, pero capitalize! devuelve nil si no se ha modificado.
11str.casecmp
Comparación de cadenas sin distinguir entre mayúsculas y minúsculas.
12str.center
Centra la cadena.
13str.chomp
Elimina el separador de registro ($/) del final de la cadena, normalmente \n. Si no hay separador de registro, no realiza ninguna operación.
14str.chomp!
Igual que chomp, pero str se modifica y se devuelve.
15str.chop
Elimina el último carácter de str.
16str.chop!
Igual que chop, pero str se modifica y se devuelve.
17str.concat(other_str)
Concatena other_str a str.
18str.count(str, ...)
Cuenta el conjunto de caracteres en uno o más conjuntos. Si hay múltiples conjuntos, cuenta la intersección de estos conjuntos.
19str.crypt(other_str)
Aplica un hash de cifrado unidireccional a str. El argumento es una cadena de dos caracteres de longitud, cada carácter está en el rango de a-z, A-Z, 0-9, . o /.
20str.delete(other_str, ...)
Devuelve una copia de str con todos los caracteres de la intersección de los argumentos eliminados.
21str.delete!(other_str, ...)
Igual que delete, pero str se modifica y se devuelve.
22str.downcase
Devuelve una copia de str donde todas las letras mayúsculas se reemplazan por letras minúsculas.
23str.downcase!
Igual que downcase, pero str se modifica y se devuelve.
24str.dump
Devuelve una versión de str donde todos los caracteres no imprimibles se reemplazan por notación \nnn y todos los caracteres especiales se escapan.
25str.each(separator=$/) { |substr| block }
Divide str usando el argumento como separador de registro (por defecto $/) y pasa cada subcadena al bloque proporcionado.
26str.each_byte { |fixnum| block }
Pasa cada byte de str al bloque y devuelve cada byte en notación decimal.
27str.each_line(separator=$/) { |substr| block }
Divide str usando el argumento como separador de registro (por defecto $/) y pasa cada subcadena al bloque proporcionado.
28str.empty?
Devuelve true si str está vacía (es decir, tiene longitud 0).
29str.eql?(other)
Si dos cadenas tienen la misma longitud y contenido, entonces son iguales.
30str.gsub(pattern, replacement) [or]
str.gsub(pattern) { |match| block }

Devuelve una copia de str donde todas las apariciones de pattern se reemplazan por replacement o por el valor del bloque. pattern suele ser una expresión regular Regexp; si es una cadena String, no se interpreta ningún metacarácter de expresión regular (es decir, /\d/ coincidirá con un dígito, pero '\d' coincidirá con una barra invertida seguida de una 'd').
31str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]
Usa los siguientes argumentos para referenciar str: si el argumento es un Fixnum, devuelve el carácter codificado del fixnum; si el argumento son dos Fixnum, devuelve una subcadena que comienza en el desplazamiento (primer fixnum) y tiene la longitud (segundo fixnum); si el argumento es un range, devuelve una subcadena dentro de ese rango; si el argumento es un regexp, devuelve la parte de la cadena que coincide; si el argumento es un regexp con un fixnum, devuelve los datos de coincidencia en la posición del fixnum; si el argumento es other_str, devuelve la subcadena que coincide con other_str. Un Fixnum negativo comienza desde el final de la cadena -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 ]
Reemplaza toda la cadena o parte de la cadena. Sinónimo de slice!.
33str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match| block }
Realiza las sustituciones de String#gsub, devuelve str, o nil si no se realizó ninguna sustitución.
34str.hash
Devuelve un hash basado en la longitud y el contenido de la cadena.
35str.hex
Interpreta los caracteres iniciales de str como una cadena de dígitos hexadecimales (un signo opcional y un 0x opcional) y devuelve el número correspondiente. Devuelve cero si hay un error.
36str.include? other_str [or] str.include? fixnum
Devuelve true si str contiene la cadena o el carácter dado.
37str.index(substring [, offset]) [or]
str.index(fixnum [, offset]) [or]
str.index(regexp [, offset])

Devuelve el índice de la primera aparición en str de la subcadena, carácter (fixnum) o patrón (regexp) dado. Devuelve nil si no se encuentra. Si se proporciona un segundo argumento, especifica la posición en la cadena donde comenzar la búsqueda.
38str.insert(index, other_str)
Inserta other_str antes del carácter en el índice dado, modificando str. Los índices negativos se cuentan desde el final de la cadena e insertan después del carácter dado. La intención es insertar una cadena comenzando en el índice dado.
39str.inspect
Devuelve una versión imprimible de str con los caracteres especiales escapados.
40str.intern [or] str.to_sym
Devuelve el símbolo correspondiente a str, creando el símbolo si no existía previamente.
41str.length
Devuelve la longitud de str. Compárala con size.
42str.ljust(integer, padstr=' ')
Si integer es mayor que la longitud de str, devuelve una nueva cadena de longitud integer, con str alineada a la izquierda y padstr como relleno. De lo contrario, devuelve str.
43str.lstrip
Devuelve una copia de str con los espacios iniciales eliminados.
44str.lstrip!
Elimina los espacios iniciales de str; devuelve nil si no hay cambios.
45str.match(pattern)
Si pattern no es una expresión regular, convierte pattern en una expresión regular Regexp y luego llama a su método de coincidencia sobre str.
46str.oct
Interpreta los caracteres iniciales de str como una cadena de dígitos decimales (con un signo opcional) y devuelve el número correspondiente. Devuelve 0 si la conversión falla.
47str.replace(other_str)
Reemplaza el contenido de str con los valores correspondientes de other_str.
48str.reverse
Devuelve una nueva cadena que es el inverso de str.
49str.reverse!
Invierte str, modificándola y devolviéndola.
50str.rindex(substring [, fixnum]) [or]
str.rindex(fixnum [, fixnum]) [or]
str.rindex(regexp [, fixnum])

Devuelve el índice de la última aparición en str de la subcadena, carácter (fixnum) o patrón (regexp) dado. Devuelve nil si no se encuentra. Si se proporciona un segundo argumento, especifica la posición en la cadena donde finalizar la búsqueda. Los caracteres más allá de ese punto no se tienen en cuenta.
51str.rjust(integer, padstr=' ')
Si integer es mayor que la longitud de str, devuelve una nueva cadena de longitud integer, con str alineada a la derecha y padstr como relleno. De lo contrario, devuelve str.
52str.rstrip
Devuelve una copia de str con los espacios finales eliminados.
53str.rstrip!
Elimina los espacios finales de str; devuelve nil si no hay cambios.
54str.scan(pattern) [or]
str.scan(pattern) { |match, ...| block }

Ambas formas iteran sobre str haciendo coincidir pattern (que puede ser una expresión regular Regexp o una cadena String). Para cada coincidencia se genera un resultado, que se añade al array de resultados o se pasa al block. Si pattern no contiene grupos, cada resultado individual se compone de la cadena coincidente, $&. Si pattern contiene grupos, cada resultado individual es un array que contiene cada entrada de grupo.
55str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]
str.slice(range) [or] str.slice(regexp) [or]
str.slice(regexp, fixnum) [or] str.slice(other_str)
See str[fixnum], etc.
str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or] str.slice!(range) [or] str.slice!(regexp) [or] str.slice!(other_str)

Elimina la parte especificada de str y devuelve la parte eliminada. Si el valor está fuera de rango, la forma con un argumento Fixnum genera un IndexError. La forma con un argumento range genera un RangeError; las formas con Regexp y String ignoran la acción.
56str.split(pattern=$;, [limit])

Divide str en subcadenas según el separador y devuelve un array de estas subcadenas.

Sipatternes una cadena String, se utilizará como separador al dividir str. Si pattern es un único espacio en blanco, str se divide por espacios, ignorando los espacios iniciales y los caracteres de espacio consecutivos.

Sipatternes una expresión regular Regexp, str se divide en los lugares donde pattern coincide. Cuando pattern coincide con una cadena de longitud cero, str se divide en caracteres individuales.

Si se omitepatternel argumento, se utiliza el valor de $;. Si $; es nil (por defecto), str se divide por espacios, como si se hubiera especificado ` ` como separador.

Si se omitelimitel argumento, se suprimen los campos nulos finales. Si limit es un número positivo, se devuelve como máximo esa cantidad de campos (si limit es 1, se devuelve toda la cadena como único elemento del array). Si limit es un número negativo, el número de campos devueltos no tiene límite y no se suprimen los campos nulos finales.

57str.squeeze([other_str]*)
Construye un conjunto de caracteres a partir de los argumentos other_str utilizando el procedimiento descrito para String#count. Devuelve una nueva cadena en la que las secuencias del mismo carácter que aparecen en el conjunto se reemplazan por un único carácter. Si no se dan argumentos, todos los caracteres idénticos se reemplazan por un único carácter.
58str.squeeze!([other_str]*)
Igual que squeeze, pero str se modifica y se devuelve; devuelve nil si no hay cambios.
59str.strip
Devuelve una copia de str con los espacios iniciales y finales eliminados.
60str.strip!
Elimina los espacios iniciales y finales de str; devuelve nil si no hay cambios.
61str.sub(pattern, replacement) [or]
str.sub(pattern) { |match| block }

Devuelve una copia de str en la que la primera aparición de pattern se reemplaza por replacement o por el valor del block. pattern suele ser una expresión regular Regexp; si es una cadena String, no se interpreta ningún metacaracter de expresión regular.
62str.sub!(pattern, replacement) [or]
str.sub!(pattern) { |match| block }

Realiza las sustituciones de String#sub y devuelve str; devuelve nil si no se realizó ninguna sustitución.
63str.succ [or] str.next
Devuelve el sucesor de str.
64str.succ! [or] str.next!
Equivale a String#succ, pero str se modifica y se devuelve.
65str.sum(n=16)
Devuelve una suma de comprobación de n bits de los caracteres de str, donde n es un parámetro Fixnum opcional que por defecto es 16. El resultado es simplemente la suma de los valores binarios de cada carácter de str, módulo 2n - 1. No es una suma de comprobación especialmente buena.
66str.swapcase
Devuelve una copia de str en la que todas las letras mayúsculas se convierten a minúsculas y todas las letras minúsculas se convierten a mayúsculas.
67str.swapcase!
Equivale a String#swapcase, pero str se modifica y se devuelve; devuelve nil si no hay cambios.
68str.to_f
Devuelve el resultado de interpretar los caracteres iniciales de str como un número de coma flotante. Los caracteres sobrantes más allá del final de los dígitos significativos se ignoran. Si no hay dígitos válidos al comienzo de str, devuelve 0.0. Este método no genera excepciones.
69str.to_i(base=10)
Devuelve el resultado de interpretar los caracteres iniciales de str como un entero con una base (base 2, 8, 10 o 16). Los caracteres sobrantes más allá del final de los dígitos significativos se ignoran. Si no hay dígitos válidos al comienzo de str, devuelve 0. Este método no genera excepciones.
70str.to_s [or] str.to_str
Devuelve el valor recibido.
71str.tr(from_str, to_str)
Devuelve una copia de str en la que los caracteres de from_str se reemplazan por los caracteres correspondientes de to_str. Si to_str es más corta que from_str, se rellena con su último carácter. Ambas cadenas pueden usar la notación c1.c2 para representar rangos de caracteres. Si from_str comienza con ^, representa todos los caracteres excepto los enumerados.
72str.tr!(from_str, to_str)
Equivale a String#tr, pero str se modifica y se devuelve; devuelve nil si no hay cambios.
73str.tr_s(from_str, to_str)
Procesa str según las reglas descritas para String#tr y luego elimina los caracteres duplicados que afectarían a la traducción.
74str.tr_s!(from_str, to_str)
Equivale a String#tr_s, pero str se modifica y se devuelve; devuelve nil si no hay cambios.
75str.unpack(format)
Decodifica str (que puede contener datos binarios) según la cadena de formato y devuelve un array con cada uno de los valores extraídos. Los caracteres de formato consisten en una serie de instrucciones de un solo carácter. Cada instrucción puede ir seguida de un número que indica el número de veces que se repite dicha instrucción. El asterisco (*) utilizará todos los elementos restantes. Las instrucciones sSiIlL pueden ir seguidas de un guion bajo (_) para usar el tamaño nativo de la plataforma subyacente para el tipo especificado; de lo contrario, se usa un tamaño consistente e independiente de la plataforma. Se ignoran los espacios en blanco en la cadena de formato.
76str.upcase
Devuelve una copia de str en la que todas las letras minúsculas se reemplazan por letras mayúsculas. La operación es insensible a la configuración regional; solo se ven afectados los caracteres de la a a la z.
77str.upcase!
Cambia el contenido de str a mayúsculas; devuelve nil si no hay cambios.
78str.upto(other_str) { |s| block }
Itera sobre valores consecutivos, comenzando en str y terminando en other_str (inclusive), pasando cada valor al block sucesivamente. El método String#succ se utiliza para generar cada valor.

Directivas unpack de cadenas

La siguiente tabla enumera las directivas de desempaquetado del método String#unpack.

InstrucciónVolverDescripción
AStringElimina los null y espacios finales.
aStringCadena.
BStringExtrae bits de cada carácter (primero el bit más significativo).
bStringExtrae bits de cada carácter (primero el bit menos significativo).
CFixnumExtrae un carácter como entero sin signo.
cFixnumExtrae un carácter como entero.
D, dFloatTrata los caracteres de longitud sizeof(double) como un double nativo.
EFloatTrata los caracteres de longitud sizeof(double) como un double en orden de bytes little-endian.
eFloatTrata los caracteres de longitud sizeof(float) como un float en orden de bytes little-endian.
F, fFloatTrata los caracteres de longitud sizeof(float) como un float nativo.
GFloatTrata los caracteres de longitud sizeof(double) como un double en orden de bytes de red.
gFloatTrata los caracteres de longitud sizeof(float) como un float en orden de bytes de red.
HStringExtrae el hexadecimal de cada carácter (primero el más significativo).
hStringExtrae el hexadecimal de cada carácter (primero el menos significativo).
IIntegerTrata los caracteres consecutivos de longitud sizeof(int) (modificada por _) como un integer nativo.
iIntegerTrata los caracteres consecutivos de longitud sizeof(int) (modificada por _) como un integer nativo con signo.
LIntegerTrata cuatro caracteres consecutivos (modificados por _) como un long integer nativo sin signo.
lIntegerTrata cuatro caracteres consecutivos (modificados por _) como un long integer nativo con signo.
MStringQuoted-Printable.
mStringCodificación Base64.
NIntegerTrata cuatro caracteres como un long sin signo en orden de bytes de red.
nFixnumTrata dos caracteres como un short sin signo en orden de bytes de red.
PStringTrata los caracteres de longitud sizeof(char *) como un puntero y devuelve \emph{len} caracteres desde la posición referenciada.
pStringTrata los caracteres de longitud sizeof(char *) como un puntero a una cadena terminada en null.
QIntegerTrata ocho caracteres como un quad word sin signo (64 bits).
qIntegerTrata ocho caracteres como un quad word con signo (64 bits).
SFixnumTrata dos caracteres consecutivos (diferentes si se usa _) como un short sin signo en orden de bytes nativo.
sFixnumTrata dos caracteres consecutivos (diferentes si se usa _) como un short con signo en orden de bytes nativo.
UIntegerCarácter UTF-8, como entero sin signo.
uStringCodificación UU.
VFixnumTrata cuatro caracteres como un long sin signo en orden de bytes little-endian.
vFixnumTrata dos caracteres como un short sin signo en orden de bytes little-endian.
wIntegerEntero comprimido BER.
X Salta hacia atrás un carácter.
x Salta hacia adelante un carácter.
ZStringUsado con *, elimina los null finales hasta el primer null.
@ Omite el desplazamiento dado por el parámetro length.

Ejemplo

Prueba los siguientes ejemplos para desempaquetar varios tipos de datos.

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