2011-03-09 39 views
23

me gustaría para que coincida con una expresión regular y obtener la posición en la cadena del partidorubí expresiones regulares: Partido y obtener la posición (s) de

Por ejemplo,

"AustinTexasDallasTexas".match_with_posn /(Texas)/ 

me gustaría match_with_posn para devolver algo como: [6, 17] donde 6 y 17 son las posiciones de inicio para ambas instancias de la palabra Texas.

¿Hay algo como esto?

+0

posible duplicado de [Cómo llegar índices de todas las ocurrencias de un patrón en una cadena] (http://stackoverflow.com/questions/4274388/how-to-get-indexes-of-all-occurrences-of-a-pattern-in-a-string) – Nakilon

Respuesta

43

El uso de Ruby 1.8.6+, usted puede hacer esto:

require 'enumerator' #Only for 1.8.6, newer versions should not need this. 

s = "AustinTexasDallasTexas" 
positions = s.enum_for(:scan, /Texas/).map { Regexp.last_match.begin(0) } 

Esto creará una matriz con:

=> [6, 17] 
+0

Si quiere encontrar atea en Isateateatest, devolverá [2], pero 5 también es una posibilidad – adcosta

+2

La "a" en el índice 5 se usa para coincidir con el "atea" que se encuentra en el índice 2. Si busca "ate" , obtendrás una matriz de '[2, 5, 8]'. Si desea encontrar coincidencias superpuestas, utilice una aserción de búsqueda anticipada: '/ (? = (Atea)) /'. 'positions = s.enum_for (: scan, /(?=(atea))/).map {Regexp.last_match.begin (0)} # => [2, 5]' –

+0

¿Puede la persona que votó por favor esto por favor? explicar el voto hacia abajo? –

24

Algo así, ver String#index

"AustinTexasDallasTexas".index /Texas/ 
=> 6 

Ahora, se podría extender el API de cadena.

class String 
    def indices e 
    start, result = -1, [] 
    result << start while start = (self.index e, start + 1) 
    result 
    end 
end 
p "AustinTexasDallasTexas".indices /Texas/ 
=> [6, 17] 
+0

funciona como un ¡encanto! ¡bonito! – Tilo

Cuestiones relacionadas