2010-11-25 14 views
10
string = "Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. " 
d = string.match(/(jack|jill)/i) # -> MatchData "Jill" 1:"Jill" 
d.size # -> 1 

Esto solo coincide con la primera aparición que parece.
string.scan hace el trabajo parcialmente pero no dice nada sobre el índice del patrón coincidente.Cómo obtener índices de todas las ocurrencias de un patrón en una cadena

¿Cómo obtengo una lista de todas las instancias coincidentes del patrón y sus índices (posiciones)?

Respuesta

19

Puede utilizar .scan y $` variable global, lo que significa La cadena a la izquierda de la última persona compatible, pero no funciona en el interior de costumbre .scan, por lo que necesita este hackear (robado de this answer) :

string = "Jack and Jill went up the hill to fetch a pail of water. Jack fell down and broke his crown. And Jill came tumbling after. " 
string.to_enum(:scan, /(jack|jill)/i).map do |m,| 
    p [$`.size, m] 
end 

salida:

[0, "Jack"] 
[9, "Jill"] 
[57, "Jack"] 
[97, "Jill"] 

UPD:

Nota el comportamiento de búsqueda hacia atrás - se obtiene el índice de la parte realmente emparejado, no el vistazo uno:

irb> "ab".to_enum(:scan, /ab/ ).map{ |m,| [$`.size, $~.begin(0), m] } 
=> [[0, 0, "ab"]] 
irb> "ab".to_enum(:scan, /(?<=a)b/).map{ |m,| [$`.size, $~.begin(0), m] } 
=> [[1, 1, "b"]] 
+1

bonita Gracias mucho –

+0

Aquí está una modificación si usted quiere poner sólo las ubicaciones de Jack en una matriz loc_array = Array.new string = "Jack y Jill subieron la colina en busca de un cubo de agua. Jack se cayó y se rompió la corona. Y Jill vino dando tumbos. " string.to_enum (: scan,/(jack)/i) .map do | m, | loc_array.push [$' .size] final – emery

1

Aquí es una modificación de la respuesta de Nakilon si usted quiere poner sólo las ubicaciones de "Jack" en una matriz

location_array = Array.new 

string = "Jack and Jack went up the hill to fetch a pail of Jack..." 
string.to_enum(:scan,/(jack)/i).map do |m,| 
    location_array.push [$`.size] 
end 
Cuestiones relacionadas