Actualmente estoy tratando de rexpilar una cadena en múltiples variables. Cadena de ejemplo:
ryan_string = "RyanOnRails: This is a test"
Lo combiné con esta expresión regular, con 3 grupos:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Ahora para acceder a cada grupo tengo que hacer algo como esto:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Esto parece bastante ridículo y parece que estoy haciendo algo mal. Esperaría poder hacer algo como esto:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
es posible? ¿O hay una mejor manera de cómo lo estoy haciendo?
fuente
one, two, three = string.match(/(^.*)(:)(.*)/i).captures
en:one, two, three = string.match(/(^.*)(:)(.*)/i).try(:captures)
&.
utilizar el nuevo operador para volver a ponerlo en línea e incluso usarlo dos veces cuando solo hay un grupo de captura. Eg ..,string.match(regex)&.captures&.first
Podrías usar Match o = ~ en su lugar, lo que le daría una sola coincidencia y podría acceder a los datos de coincidencia de la misma manera o simplemente usar las variables de coincidencia especiales $ 1, $ 2, $ 3
Algo como:
fuente
Puedes nombrar tus partidos capturados
No funciona si invierte el orden de la cadena y la expresión regular.
fuente
¡Debe decidir si es una buena idea, pero ruby regexp puede (automáticamente) definir variables locales para usted!
Todavía no estoy seguro de si esta característica es increíble o simplemente totalmente loca, pero su expresión regular puede definir variables locales.
(Eche un vistazo a http://ruby-doc.org/core-2.1.1/Regexp.html , busque "variable local").
Nota: Como se señaló en un comentario, veo que hay una respuesta similar y anterior a esta pregunta por @toonsend ( https://stackoverflow.com/a/21412455 ). No creo que estuviera "robando", pero si quieres ser justo con los elogios y honrar la primera respuesta, siéntete libre :) Espero que ningún animal haya sido dañado.
fuente
scan()
encontrará todas las coincidencias no superpuestas de la expresión regular en su cadena, por lo que en lugar de devolver una matriz de sus grupos como parece esperar, está devolviendo una matriz de matrices.Probablemente sea mejor usar
match()
, y luego obtener la matriz de capturas usandoMatchData#captures
:Sin embargo, también podría hacer esto
scan()
si quisiera:fuente