Estoy buscando una forma de realizar una coincidencia de expresiones regulares en una cadena en Ruby y hacer que se produzca un cortocircuito en la primera coincidencia.
La cadena que estoy procesando es larga y, por lo que parece, la forma estándar ( match
método) procesa todo, recopila cada coincidencia y devuelve un objeto MatchData que contiene todas las coincidencias.
match = string.match(/regex/)[0].to_s
capture
argumento, que te permite devolver una captura en lugar de la coincidencia completa.Puedes usar
[]
: (que es comomatch
)fuente
Si solo la existencia de una coincidencia es importante, puede ir con
De cualquier manera,
match
solo debe devolver el primer resultado, mientrasscan
busca en toda la cadena. Por tanto, sifuente
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.
(Tomado de http://ruby-doc.org/core-2.1.1/Regexp.html ).
fuente
regex =~ string", not when
string = ~ regex`Una expresión regular (regex) no es más que una máquina de estados finitos (FSM).
Un FSM intenta responder a la pregunta "¿Es este estado posible o no?"
Sigue intentando hacer coincidir un patrón hasta que se encuentra una coincidencia (éxito), o hasta que se exploran todas las rutas y no se encuentra ninguna coincidencia (error).
Sobre el éxito, la pregunta "¿Es este estado posible o no?" ha sido respondido con un "sí". Por lo tanto, no se necesitan más coincidencias y la expresión regular regresa.
Vea esto y esto para más sobre esto.
Además: aquí hay un ejemplo interesante para demostrar cómo funciona la expresión regular. Aquí, se usa una expresión regular para detectar si un número dado es primo. Este ejemplo está en perl, pero también se puede escribir en ruby.
fuente