2010-09-06 8 views
5

Esto es lo que estoy haciendoRegex - Ahorro Repitiendo Capturado Grupo

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.match(/(^\%\w+)([\.|\#]\w+)+/) 
puts a.inspect 

Esto es lo que me pasa

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever"> 

Esto es lo que quiero

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever"> 

ayuda? Lo intenté y fracasé :(

Respuesta

3

eso es sólo cómo funcionan los grupos de captura Si desea guardar todas esas subseries, poner el cuantificador dentro el grupo de captura:.

a = a.match(/(^%\w+)((?:[.#]\w+)+)/) 

Luego, su segunda captura será :.

2:".rockets#diamonds.ribbons.forever" 

... y se puede romper hacia abajo el resto del camino a ti mismo

8

En general, no se puede conseguir un número arbitrario de grupos de captura, pero si se utiliza scan puede obtener un partidopara cada simbólico que desea capturar:

a = "%span.rockets#diamonds.ribbons.forever" 
a = a.scan(/^%\w+|\G[.|#]\w+/) 
puts a.inspect 

["%span", ".rockets", "#diamonds", ".ribbons", ".forever"] 

Esto no es demasiado diferente de su expresión regular, pero eliminado en la repetición último token \G no es muy conocido: le dice al motor que coincida con el lugar donde terminó la partida anterior, por lo que no se rompe cuando tiene caracteres adicionales entre las coincidencias (%span :P .rockets).

Generalmente, si tenía varias coincidencias de su expresión regular original, este método puede agregar algo de trabajo, porque no tiene los grupos separados para las coincidencias, pero dado que match arroja un resultado único, debería funcionar bien.

Ejemplo de trabajo: http://ideone.com/nnmki

Cuestiones relacionadas