2012-06-26 33 views
5
my @matches = ($result =~ m/INFO\n(.*?)\n/); 

Así en Perl Quiero almacenar todas las coincidencias con esa expresión regular. Estoy buscando almacenar el valor entre INFO \ n y \ n cada vez que ocurre.Regex: ¿coincide con todas las apariciones?

Pero solo estoy obteniendo la última ocurrencia almacenada. ¿Está mal mi expresión regular?

+0

posible duplicado de [¿Cómo puedo encontrar todas las coincidencias con una expresión regular en Perl?] (Http://stackoverflow.com/questions/1723440/how-can-i-find-all-matches-to-a- regular-expresión-en-perl) – centic

Respuesta

10

Utilice el modificador /g para la concordancia global.

my @matches = ($result =~ m/INFO\n(.*?)\n/g); 

cuantificación perezoso es innecesaria en este caso como . no coincide con saltos de línea. A continuación se daría un mejor rendimiento:

my @matches = ($result =~ m/INFO\n(.*)\n/g); 

/s se puede utilizar si lo hace querer períodos para que coincida con los saltos de línea. Para obtener más información acerca de estos modificadores, consulte perlre.

+0

La cuantificación diferida '. *?' duele el rendimiento de la expresión regular –

+0

¿Por qué '/ s' es necesario? No veo ninguna razón para eso, ya que su partida ** no debe contener ** ningún carácter de línea nueva. –

+0

Tiene razón en que no importa en este caso, pero como él no sabía sobre '/ g' y estaba haciendo coincidir cadenas de varias líneas, parecía razonable que necesitaría'/s' tarde o temprano. – Tim

Cuestiones relacionadas