Cos’è Greedy?

0
10

Questo articolo spiegherà in dettaglio cos’è Greedy e come usare Greedy.

Avido

Con le espressioni regolari e i caratteri jolly, greedy descrive un tipo di corrispondenza che continua a cercare una corrispondenza anche dopo che viene trovata una corrispondenza. Ad esempio, la seguente espressione regolare greedy Perl “.*e” corrisponde a tutto il testo fino all’ultima lettera “e” nella variabile $esempio. Questo esempio restituisce “Corrispondenza: Computer Hope”, non “Calcola”, perché il testo ha più caratteri “e”.

my $example = "Computer Hope";
$example =~ m/.*e/;
print "Matched: $&n";
Consiglio

In Perl, $& è un modo rapido per trovare tutto ciò che è stato abbinato.

Un metodo per rendere l’espressione regolare non greedy (lazy matching), consiste nell’aggiungere un punto interrogativo (?) dopo l’asterisco

my $example = "Computer Hope";
$example =~ m/.*?e/;
print "Matched: $&n";
print "After: $'n";

, come mostrato di seguito. L’aggiunta del punto interrogativo indica al computer di interrompere la ricerca di corrispondenze una volta trovata una corrispondenza.

Matched: Compute
After: r Hope
L’esecuzione dello script sopra restituisce il testo seguente.

Consiglio

In Perl, $’ è un modo rapido per trovare tutto dopo la partita.

Il punto interrogativo può essere aggiunto ad altri token di espressioni regolari anch’essi avidi. Ad esempio, se stai usando un segno più (+) invece di un asterisco, puoi cambiarlo in “+?” nella tua espressione regolare.

Perché non dovresti fare abbinamenti golosi?

my $html = "Test <b>one</b> two <b>three</b>.";
$html =~ s/<.*>//g;
print "Output: $htmln";

Fare una corrispondenza golosa aggiunge molto lavoro extra che di solito non è richiesto, il che rende la corrispondenza del testo molto più lenta. Ad esempio, se stai analizzando un file HTML e desideri rimuovere tutti i tag HTML, la seguente espressione regolare greedy causa lavoro extra e fallisce.

Output: Test .

A causa della corrispondenza greedy, l’espressione regolare corrisponde all’apertura del primo tag e quindi abbina tutto alla fine dell’ultimo tag. Nel nostro esempio sopra, il testo seguente verrebbe restituito perché tutto ciò che è compreso tra il primo minore di (<) e l'ultimo maggiore di (>) è abbinato.

my $html = "Test <b>one</b> two <b>three</b>.";
$html =~ s/<.*?>//g;
print "Output: $htmln";

L’aggiunta di un punto interrogativo dopo l’asterisco rende pigra l’espressione regolare e visualizza un output migliore.

Output: Test one two three.

Con la corrispondenza pigra, il testo viene abbinato fino al primo maggiore di, ma poiché /g (globalmente) viene utilizzato, si ripete finché la stringa non ha più HTML. Con questa espressione regolare otteniamo il seguente output.

my $html = "Test <b>one</b> two <b>three</b>.";
$html =~ s/<[^<>]+>//g;
print "Output: $htmln";

La corrispondenza pigra aiuta a correggere i problemi con la corrispondenza di troppo testo e aumenta l’efficienza della corrispondenza. Tuttavia, potrebbe essere ulteriormente migliorato se “.*” viene sostituito con esattamente quale testo deve corrispondere o non corrispondere. Ad esempio, utilizzando il nostro stesso esempio HTML, potremmo utilizzare la seguente espressione regolare. [^<>]Nell’esempio sopra,

+ in un’espressione regolare Perl dice di corrispondere a qualsiasi carattere che non sia un simbolo minore o maggiore di. Questa espressione regolare è più veloce e aiuta anche a non far corrispondere HTML non valido o testo contenente un simbolo minore o maggiore di cui non è stato eseguito l’escape utilizzando il nome o il numero dell’entità.

LEAVE A REPLY

Please enter your comment!
Please enter your name here