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

Tak więc w Perlu chcę przechowywać wszystkie dopasowania do tego wyrażenia regularnego. Szukam przechowywania wartości między INFO \ n i \ n za każdym razem, gdy występuje.Regex - Dopasuj wszystkie wystąpienia?

Ale dostaję tylko ostatnie zachowanie. Czy mój regex jest zły?

+0

możliwy duplikat [Jak znaleźć wszystkie dopasowania do wyrażenia regularnego w Perlu?] (Http://stackoverflow.com/questions/1723440/how-can-i-find-all-matches-toa-a- regularne-wyrażenia-w-perlu) – centic

Odpowiedz

10

Użyj modyfikatora /g do dopasowania globalnego.

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

Lazy kwantyfikacji jest konieczne w tym przypadku jako . nie zgadza się nowe linie. Poniższa dałby lepszą wydajność:

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

/s może być używany, jeśli nie chcesz, aby dopasować nowe linie okresy. Aby uzyskać więcej informacji o tych modyfikatorach, zobacz perlre.

+0

Lazy kwantyfikacja '. *?' boli regex wydajność –

+0

Dlaczego '/ s' jest potrzebna? Nie widzę powodu, dla którego jego dopasowanie ** nie powinno ** zawierać żadnych znaków nowej linii. –

+0

Masz rację, że nie ma to znaczenia w tym przypadku, ale ponieważ nie wiedział o '/ g' i dopasowywał wieloliniowe ciągi, wydawało się rozsądne, że prędzej czy później będzie potrzebował'/s'. – Tim

Powiązane problemy