2015-10-05 4 views
6

Abbiamo appena trovato un bug in qualche codice in cui il programmatore aveva usato l'equivalente di (.)+ quando avrebbero dovuto usare (.+). Una soluzione abbastanza semplice, ma non siamo in grado di spiegare il comportamento di (.)+. Qualcuno può spiegare perché questo corrisponde a "e", l'ultima lettera, e non "b", la prima lettera dopo "a" nella regex? Come spiegheresti (.)+?qual è il comportamento di (.) + In un'espressione regolare?

my $s = 'abcde'; 

if ($s =~ m{ a (.)+ }x){ 
    print "s '$s' matched '$1'\n"; 
}else{ 
    print "total match fail\n"; 
} 

__END__ 
output: 
s 'abcde' matched 'e' 
+1

Credo che la ragione di questo sia perché continua a corrispondere fino a quando non riesce a corrispondere al modello. A quel punto è l'ultimo carattere abbinato presente nel gruppo di cattura. –

+1

Prova ad aggiungere 'use re 'debug';' all'inizio del tuo codice. Questo è utile per tenere traccia di ciò che sta accadendo. – Sobrique

+4

Mi piace la spiegazione in [Ripetizione di un gruppo di acquisizione rispetto alla cattura di un gruppo ripetuto] (http://www.regular-expressions.info/captureall.html). – ThisSuitIsBlackNot

risposta

10

C'è una differenza enorme tra (.)+ e (.+) ma solo in termini di ciò che viene catturato, non ciò che è abbinato.

(.)+ cerca uno o più istanze di un singolo carattere e cattura l'ultimo di questi.

(.+) cerca uno o più caratteri singoli e li cattura tutti in una volta.

+0

Non so quanto sia documentato/sicuro '(.) +'. Io userei '(.). *'. – ikegami

+3

@ikegami Non dovrebbe essere '. * (.)'? – AnFi

+0

@Andrzej A. Filip, ack! Sì, intendevo ". * (.)' – ikegami

Problemi correlati