2011-11-03 14 views
34

Soy nuevo en Ruby y siempre he usado String.scan para buscar la primera aparición de un número. Es extraño que el valor devuelto esté en una matriz anidada, pero acabo de ir al [0][0] para obtener los valores que quiero. (Estoy seguro de que tiene su propósito, solo que no lo he usado todavía)Cuál es la diferencia entre el escaneo y el partido en la cadena Ruby

Me acabo de enterar de que hay un método String.match. Y parece ser más conveniente porque la matriz devuelta no está anidada.

Aquí se muestra un ejemplo de los dos, primero es escanear:

>> 'a 1-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"]] 

entonces es partido

>> 'a 1-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 

tengo comprobar la API, pero realmente no puedo distinguir la diferencia, como se ambos se refieren a "coincidir con el patrón".

Esta pregunta es, simplemente por curiosidad, sobre qué puede hacer scan que no puede, y viceversa. Cualquier escenario específico que solo uno puede lograr? ¿Es match el inferior de scan?

Respuesta

40

Respuesta corta: scan devolverá todas las coincidencias. Esto no lo hace superior, porque si solo quiere la primera coincidencia, str.match[2] lee mucho mejor que str.scan[0][1].

ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a)?(\d*)[- ]night/i).to_a 
=> [["a ", "1"], ["a ", "2"]] 
ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a)?(\d*)[- ]night/i).to_a 
=> ["a 1-night", "a ", "1"] 
17

#scan devuelve todo lo que coincide con la expresión regular.

#match devuelve el primer partido como un objeto MatchData, que contiene datos en poder de las variables especiales como $& (lo que fue seguido de la expresión regular, eso es lo que hay de mapeo para el índice 0), $1 (partido 1), $2, et al.

Cuestiones relacionadas