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

Quindi in Perl voglio memorizzare tutte le corrispondenze con quell'espressione regolare. Sto cercando di memorizzare il valore tra INFO \ n e \ n ogni volta che si verifica.Regex: corrisponde a tutte le occorrenze?

Ma sto solo ricevendo l'ultima occorrenza memorizzata. La mia regex è sbagliata?

+0

possibile duplicato di [Come posso trovare tutte le corrispondenze con un'espressione regolare in Perl?] (Http://stackoverflow.com/questions/1723440/how-can-i-find-all-matches-to-a- regular-expression-in-perl) – centic

risposta

10

Utilizzare il modificatore /g per la corrispondenza globale.

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

quantificazione pigro non è necessaria in questo caso come . non corrisponde a capo. Di seguito darebbe una migliore performance:

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

/s può essere utilizzato se si vuole periodi da abbinare a capo. Per maggiori informazioni su questi modificatori, vedi perlre.

+0

quantificazione pigra '. *?' fa male prestazioni regex –

+0

Perché '/ s' è necessario? Non vedo alcun motivo per questo, dato che la sua corrispondenza ** non dovrebbe ** contenere alcun carattere di nuova riga. –

+0

Hai ragione che non ha importanza in questo caso, ma dal momento che non sapeva di '/ g' e stava abbinando stringhe multi-linea, sembrava ragionevole che avrebbe avuto bisogno di'/s' prima o poi. – Tim

Problemi correlati