2012-07-09 12 views
21

Ho un espressione regolare che corrisponde ad alcune testo come:Perl Regular Expression - Che cosa significa modificatore gc?

$text =~ m/$regex/gcxs 

Ora voglio sapere che cosa significa modificatore 'gc':

ho cercato e trovato che gc significa "Consenti ricerca continua dopo la corrispondenza fallita/g ".

Questo non è chiaro per me. Cosa significa ricerca continua?

Per quanto ho capito, significa che iniziare la corrispondenza all'inizio se la ricerca /g non riesce. Ma il modificatore /g non corrisponde all'intera stringa?

risposta

32

Il modificatoreviene utilizzato per ricordare la "posizione in una stringa" in modo da poter elaborare in modo incrementale una stringa. per esempio.

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

Poiché la posizione viene ripristinato su una partita di fallito, l'uscita sarà sopra

abcabc3de 

La bandiera /c non reimposta la posizione su una partita fallito. Quindi, se aggiungiamo /c alla prima regex in questo modo

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

Finiamo con il codice di

abc3de 

Esempio: http://ideone.com/cC9wb

+1

grazie per la bella spiegazione – AnonGeek

+0

Questa risposta è stato aggiunto alla [Stack Overflow Regular Expression FAQ] (http://stackoverflow.com/a/22944075/2736496), in "modificatori ". – aliteralmind

3

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

corrispondenza globale e mantenere la posizione corrente dopo l'abbinamento fallito. A differenza di i, m, s e x, questi due flag influenzano il modo in cui viene usata la regex piuttosto che la regex stessa. Vedi Uso delle espressioni regolari in Perl in perlretut per ulteriori spiegazioni dei modificatori g e c.

L'arbitro specificato porta a:

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

Questo URI ha una sotto-sezione intitolata, 'la corrispondenza globale', che contiene un piccolo tutorial/esempio di lavoro, tra cui:

Una corrispondenza non riuscita o la modifica della stringa di destinazione reimposta la posizione. Se non si desidera che la posizione venga ripristinata dopo la mancata corrispondenza, aggiungere // c, come in/regexp/gc. La posizione corrente nella stringa è associata alla stringa, non alla regexp. Ciò significa che diverse stringhe hanno posizioni diverse e le loro rispettive posizioni possono essere impostate o lette indipendentemente.

HTH Lee