Como ya sabrá, las cadenas en Ruby son lo que se conoce como objetos de primera clase que utilizan varios métodos para consultas y manipulación..
Una de las acciones más básicas de manipulación de cadenas es dividir una cadena en múltiples subcadenas. Esto se haría, por ejemplo, si tiene una cadena como"foo, bar, baz" y quieres las tres cuerdas "foo", "bar" y "baz". los división El método de la clase String puede lograr esto por usted.
El uso más básico de la división El método consiste en dividir una cadena basada en un solo carácter o secuencia estática de caracteres. Si el primer argumento de split es una cadena, los caracteres en esa cadena se usan como delimitadores de separador de cadena, mientras que en los datos delimitados por comas, la coma se usa para separar datos.
#! / usr / bin / env ruby
str = "foo, bar, baz"
pone str.split (",")
$ ./1.rb
foo
bar
baz
Hay formas más fáciles de delimitar la cadena. El uso de una expresión regular como delimitador hace que el método de división sea mucho más flexible.
De nuevo, tome por ejemplo la cadena "foo, bar, baz". Hay un espacio después de la primera coma, pero no después de la segunda. Si la cadena "," se usa como delimitador, todavía existirá un espacio al comienzo de la cadena "barra". Si se usa la cadena "," (con un espacio después de la coma), solo coincidirá con la primera coma ya que la segunda coma no tiene un espacio después. Es muy limitante.
La solución a este problema es usar una expresión regular como argumento delimitador en lugar de una cadena. Las expresiones regulares le permiten emparejar no solo secuencias estáticas de caracteres, sino también números indeterminados de caracteres y caracteres opcionales.
Al escribir una expresión regular para su delimitador, el primer paso es describir con palabras qué es el delimitador. En este caso, la frase "una coma que puede ser seguida por uno o más espacios" es razonable.
Hay dos elementos en esta expresión regular: la coma y los espacios opcionales. Los espacios utilizarán el cuantificador * (estrella o asterisco), que significa "cero o más". Cualquier elemento que preceda esto coincidirá con cero o más veces. Por ejemplo, la expresión regular /un*/ coincidirá con una secuencia de cero o más caracteres 'a'.
#! / usr / bin / env ruby
str = "foo, bar, baz"
pone str.split (/, * /)
$ ./2.rb
foo
bar
baz
Imagine una cadena de valores separados por comas, como "10,20,30, esta es una cadena arbitraria". Este formato tiene tres números seguidos de una columna de comentarios. Esta columna de comentarios puede contener texto arbitrario, incluido texto con comas. Para prevenir división de dividir el texto de esta columna, podemos establecer un número máximo de columnas para dividir.
Nota: Esto solo funcionará si la cadena de comentarios con el texto arbitrario es la última columna de la tabla.
Para limitar el número de divisiones que realizará el método de división, pase el número de campos en la cadena como un segundo argumento al método de división, de esta manera:
#! / usr / bin / env ruby
str = "10,20,30, diez, veinte y treinta"
pone str.split (/, * /, 4)
$ ./3.rb
10
20
30
Diez, veinte y treinta
¿Y si quisieras usar división para obtener todos los artículos pero el primero?
En realidad es muy simple:
primero, * rest = ex.split (/, /)
El método de división tiene algunas limitaciones bastante grandes..
Toma por ejemplo la cuerda '10, 20, "Bob, Eve y Mallory", 30 '. Lo que se pretende son dos números, seguidos de una cadena entre comillas (que puede contener comas) y luego otro número. Dividir no puede separar correctamente esta cadena en campos.
Para hacer esto, el escáner de cadenas debe ser con estado, lo que significa que puede recordar si está dentro de una cadena entre comillas o no. El escáner dividido no tiene estado, por lo que no puede resolver problemas como este.