2013-10-25 8 views
8

Sono sconcertato da espressioni regolari come .*come fa l'espressione regolare come il lavoro in Perl

#!usr/bin/perl 
use strict; 
use warnings; 

my $text = "scott"; 
$text =~ s/.*/\//g; 
print $text; 

di uscita "*": //

Quindi, non so il motivo per cui il risultato è piuttosto // di /.

+0

'.' corrisponde a qualsiasi carattere e' * 'corrisponde a 0 oa qualsiasi occorrenza del precedente. Quindi '. *' Significa corrispondere a qualsiasi cosa – bansi

+0

@bansi Quindi perché * non corrisponde a * tutto? – user2864740

+0

'perl -MData :: Dumper -e '$ text =" scott "; $ text = ~ s /(.*)/ print Dumper $ 1/ge'' –

risposta

4

La prima volta, .* corrisponde a 5 caratteri a partire dalla posizione zero (scott). Questo viene sostituito con /.

/g significa corrispondere quante più volte possibile, quindi riprova, questa volta inizia dalla posizione cinque.

La seconda volta, .* corrisponde a 0 caratteri che iniziano alla posizione cinque (stringa vuota). Questo viene sostituito con /.

La terza volta attraverso, .* va a partite 0 personaggi che iniziano alla posizione cinque (""), ma c'è un controllo che si assicura che non corrisponde alla stessa posizione di partenza e la lunghezza per due volte di fila. Quindi avanza la posizione e cerca di eguagliare nella posizione sei. Dal momento che è al di fuori della stringa fallisce.

+0

Sono d'accordo con te. in realtà, se rimuovo/g l'opzione, sarà/(una barra). Inoltre, s /.*? T/g => // e s /.*? T/=> /, quindi sono sicuro di te. – yQuery

+0

non corrisponde per la lunghezza zero nella stessa posizione di partenza due volte di seguito; con una lunghezza diversa da zero, non può avere la stessa posizione di partenza – ysth

+0

@ysth, stessa cosa. La mia formulazione rende chiaro che un loop infinito ne conseguirebbe altrimenti. – ikegami

10

.* corrisponde a due volte. In primo luogo, corrisponde a "scott". Quindi corrisponde alla stringa vuota dopo lo "scott".

+2

Effettivamente. Esegui con 'use re" debug ";' per vedere chi è corretto :) – ysth

+1

Questa è l'unica risposta corretta. –

+1

Questo è. Usa '$ text = ~ s/(. *)/-> $ 1 <-/g;' per verificare facilmente. – DeVadder

Problemi correlati