2012-07-09 30 views
21

Mam regex, który pasuje jakiś tekst jako:Perl Wyrażenie regularne - co oznacza modyfikator gc?

$text =~ m/$regex/gcxs 

Teraz chcę wiedzieć, co 'GC' modyfikator oznacza:

Szukałem i znalazłem że GC oznacza „Zezwól kontynuacja wyszukiwania po nieudanym/g dopasowaniu ".

Nie jest to dla mnie jasne. Co oznacza ciągłe wyszukiwanie?

O ile zrozumiałem, oznacza to, że należy rozpocząć dopasowywanie na początku, jeśli wyszukiwanie nie powiedzie się. Ale czy modyfikator pasuje do całego ciągu znaków?

Odpowiedz

32

Modyfikator /g służy do zapamiętania "pozycji w łańcuchu", aby można było stopniowo przetwarzać ciąg znaków. na przykład

my $txt = "abc3de"; 
while($txt =~ /\G[a-z]/g) 
{ 
    print "$&"; 
} 
while($txt =~ /\G./g) 
{ 
    print "$&"; 
} 

Ponieważ pozycja jest resetowany na nieudanym meczu, wyjście powyżej wola

abcabc3de 

/c flaga nie resetuje pozycję na nieudanym meczu. Więc jeśli dodamy /c do pierwszego regex jak tak

my $txt = "abc3de"; 
while($txt =~ /\G[a-z]/gc) 
{ 
    print "$&"; 
} 
while($txt =~ /\G./g) 
{ 
    print "$&"; 
} 

Skończymy z kodem

abc3de 

Sample: http://ideone.com/cC9wb

+1

dzięki za miły wyjaśnienie – AnonGeek

+0

Ta odpowiedź została dodana do sieci [przepełnienie stosu wyrażenie regularne FAQ] (http://stackoverflow.com/a/22944075/2736496), pod „Modyfikatory ". – aliteralmind

3

W perldoc perlre http://perldoc.perl.org/perlre.html#Modifiers

globalnego dopasowania i zachować aktualną pozycję po nieudanym dopasowaniu. W przeciwieństwie do i, m, s i x, te dwie flagi wpływają na sposób użycia regex, a nie na samo wyrażenie. Zobacz Wyrażenia regularne w Perlu w perlretut, aby dowiedzieć się więcej o modyfikatorach g i c.

Podany ref prowadzi do:

http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl

URI ma podrozdział zatytułowany 'Globalny dopasowanie', która zawiera niewielką samouczek/example roboczą, w tym:

Nieudane dopasowanie lub zmiana ciągu docelowego powoduje zresetowanie pozycji. Jeśli nie chcesz zresetować pozycji po niepowodzeniu, dodaj // c, jak w/regexp/gc. Bieżąca pozycja w ciągu jest powiązana z ciągiem znaków, a nie z wyrażeniem regularnym. Oznacza to, że różne łańcuchy mają różne pozycje, a ich odpowiednie pozycje można niezależnie ustawić lub odczytać.

HTH Lee