2011-11-04 12 views
6

tengo una cadena que se ve algo como esto:Ruby: ¿Cómo analizar una cadena para sacar algo y asignarlo a una variable

"my name is: andrew" 

me gustaría analizar la cadena, saque el nombre de la cadena, y asignarlo a una variable. ¿Cómo haría esto con Ruby?

Actualización:

La cadena utilicé como ejemplo era sólo un ejemplo. Las cadenas con las que trabajaré pueden cambiar los formatos, por lo que no puede confiar en que los dos puntos estén en el ejemplo real. Aquí hay algunos ejemplos que estoy trabajando con:

"/nick andrew"  # command: nick, value: "andrew" 
"/join developers" # command: join, value: "developers" 
"/leave"   # command: leave, value: nil 

me gustaría usar algún tipo de expresión regular para resolver este (ya que la cadena puede cambiar los formatos), en lugar de dividir la cadena en ciertos caracteres o dependiendo de un cierto número de posición de personaje.

+0

Dado que se expandía la pregunta central, que debe aceptar una respuesta en esta pregunta y hacer otra pregunta para su respuesta ampliada . – Zabba

+3

No hay una expresión regular mágica que analizará todo. Tienes que trabajar con una gramática definida. –

+0

Tienes que tener un ejemplo de todos los formatos posibles de la cadena para que puedas generar una expresión regular para obtener una pieza específica. Si no puede proporcionar detalles exactos, entonces su pregunta es abierta y no puede ser respondida. –

Respuesta

5

This tutorial realmente me ayudó a entender cómo trabajar con expresiones regulares en Ruby.

Una forma de usar una expresión regular para obtener la cadena que desea es reemplazar las cosas que no desea con una cadena vacía.

original_string = "my name is: andrew" 
name = original_string.sub(/^my name is: /, '') # => 'andrew' 

another_format = "/nick andrew" 
name = another_format.sub(/^\/nick /, '') # => 'andrew' 

Sin embargo, eso es solo una cadena de reemplazo/sustitución. La expresión regular no está capturando anyting.

Para capturar una cadena mediante una expresión regular, puede utilizar el método de Ruby match:

original_string = "my name is: andrew" 
matches = original_string.match /^my name is: (.*)/ 
name = matches[1] # return the first match 
2

Una forma de hacerlo es:

s = "my name is: andrew" 
pos = (s =~ /(?!.*:).*/) 
result = s[pos..-1] 
p result.strip! # "andrew" 

Otra:

s = "my name is: andrew"; 
p s.slice(s.index(":")..-1) # "andrew" 
12
s = "my name is: andrew" 
p s.split(':')[1].strip # "andrew" 

Ver

  1. split
  2. strip
5

Otra forma:

name = "my name is: andrew".split(/: */)[1] # => "andrew" 

o name = "mi nombre es Andrew" .split. (/ * /) El pasado # => "Andrew"


Breaking hacia abajo, primero lo dividimos en partes. La expresión regular /: */dice a: seguido de cualquier cantidad de espacios será nuestro divisor.

"my name is: andrew".split(/: */) # => ["my name is", "andrew"] 

Luego seleccione el segundo punto:

["my name is", "andrew"][1] # => "andrew" 
1
s.split.last 

que debería funcionar con todos sus casos.

Cuestiones relacionadas