Cómo usar la sustitución de cadenas en Ruby

Dividiendo una cuerda es solo una forma de manipular datos de cadena. También puede hacer sustituciones para reemplazar una parte de una cadena con otra cadena. Por ejemplo, en una cadena de ejemplo (foo, bar, baz), reemplazar "foo" por "boo" generaría "boo, bar, baz". Puedes hacer esto y muchas más cosas usando el sub y gsub método en la clase de cadena.

Muchas opciones para la sustitución de rubíes

Los métodos de sustitución vienen en dos variedades. los sub El método es el más básico de los dos y viene con la menor cantidad de sorpresas. Simplemente reemplaza la primera instancia del patrón designado con el reemplazo.

Mientras sub solo reemplaza la primera instancia, la gsub El método reemplaza cada instancia del patrón con el reemplazo. Además, ambos sub y gsub tener ¡sub! y gsub! contrapartes Recuerde, los métodos en Rubí que terminan en un signo de exclamación alteran la variable en lugar de devolver una copia modificada.

Buscar y reemplazar

El uso más básico de los métodos de sustitución es reemplazar una cadena de búsqueda estática con una cadena de reemplazo estática. En el ejemplo anterior, "foo" fue reemplazado por "boo". Esto se puede hacer para la primera aparición de "foo" en la cadena usando el

instagram viewer
sub método o con todas las apariciones de "foo" utilizando el gsub método.

#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
pone b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz

Búsqueda flexible

La búsqueda de cadenas estáticas solo puede llegar tan lejos. Eventualmente, te encontrarás con casos en los que un subconjunto de instrumentos de cuerda o las cadenas con componentes opcionales deberán coincidir. Los métodos de sustitución pueden, por supuesto, coincidir con expresiones regulares en lugar de cadenas estáticas. Esto les permite ser mucho más flexibles y combinar prácticamente cualquier texto que puedan soñar.

Este ejemplo es un poco más del mundo real. Imagine un conjunto de valores separados por comas. Estos valores se introducen en un programa de tabulación sobre el que no tiene control (cerrado fuente). El programa que genera estos valores también es de código cerrado, pero genera algunos datos con un formato incorrecto. Algunos campos tienen espacios después de la coma y esto hace que el programa tabulador se rompa.

Una posible solución es escribir un programa Ruby para que actúe como "pegamento" o filtro, entre los dos programas. Este programa Ruby solucionará cualquier problema en el formato de datos para que el tabulador pueda hacer su trabajo. Para hacer esto, es bastante simple: reemplace una coma seguida de varios espacios con solo una coma.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/, + /, ",")
pone l
final
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2.rb
10,20,30
12.8,10.4,11

Reemplazos flexibles

Ahora imagina esta situación. Además del formato menor errores, el programa que produce los datos produce datos numéricos en notación científica. El programa tabulador no comprende esto, por lo que tendrá que reemplazarlo. Obviamente, un simple gsub no funcionará aquí porque el reemplazo será diferente cada vez que se realice el reemplazo.

Afortunadamente, los métodos de sustitución pueden tomar un bloque para los argumentos de sustitución. Por cada vez que se encuentra la cadena de búsqueda, el texto que coincide con la cadena de búsqueda (o expresión regular) se pasa a este bloque. El valor producido por el bloque se usa como la cadena de sustitución. En este ejemplo, un número de coma flotante en forma de notación científica (como 1.232e4) se convierte en un número normal con un punto decimal. La cadena se convierte en un número con to_f, entonces el número se formatea con una cadena de formato.

#! / usr / bin / env ruby
STDIN.each do | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) do | n |
"% .3f"% n.to_f
final
l.gsub! (/, + /, ",")
pone l
final
gsub $ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub $ cat floatdata.txt | ./3.rb
0.222,54,11
3156680.000,21,7

¿No está familiarizado con las expresiones regulares?

Retrocedamos un paso y veamos eso expresión regular. Parece críptico y complicado, pero es muy simple. Si no está familiarizado con las expresiones regulares, pueden ser bastante crípticas. Sin embargo, una vez que esté familiarizado con ellos, son métodos sencillos y naturales para describir el texto. Hay varios elementos, y varios de los elementos tienen cuantificadores.

El elemento principal aquí es el \re clase de personaje Esto coincidirá con cualquier dígito, los caracteres del 0 al 9. El cuantificador + se usa con la clase de caracteres de dígitos para indicar que uno o más de estos dígitos deben coincidir en una fila. Tienes tres grupos de dígitos, dos separados por un "."y el otro separado por la letra"mi"(para exponente).

El segundo elemento que flota es el carácter menos, que utiliza el "?"cuantificador. Esto significa "cero o uno" de estos elementos. Entonces, en resumen, puede haber o no signos negativos al comienzo del número o exponente.

Los otros dos elementos son los. (punto) carácter y el mi personaje. Combine todo esto y obtendrá una expresión regular (o un conjunto de reglas para hacer coincidir el texto) que coincida con los números en forma científica (como 12.34e56).

instagram story viewer