PDA

Visualizza la versione completa : RE - dubbio con .? e .??


Mich_
07-10-2004, 12:21
Per un progetto, sto sviluppando delle regexp sotto Perl.

Ho un dubbio riguardo l'uso del ? e ?? dentro la RE.

Secondo voi, che differenza di output c'e` tra queste tre espressioni?

$s =~ s/([^\w\.])$k([^\w])/$1$m$2/gs;
$s =~ s/(.?[^\w\.])$k([^\w].?)/$1$m$2/gs;
$s =~ s/(.??[^\w\.])$k([^\w].??)/$1$m$2/gs;
(l'unica differenza e` il carattere . seguito da uno o due ?)
$m e $k sono delle variabili definite: devo sostituire $m al posto di $k in tutta la stringa, solo se $k non e` compreso tra caratteri alfanumerici e non e` preceduto da .

Credevo che fossero equivalenti, invece la prima e la terza mi danno lo stesso risultato, mentre la seconda no (mi salta alcune sostituzioni nella stringa).

Grazie in anticipo.
Mich_

shishii
07-10-2004, 18:02
questo esempio tratto da perlre molto esplicativo:

For example:

$_ = 'bar';
s/\w??/<$&>/g;

results in <>[b]<><a><><r><>. At each position of the string the best match given by non-greedy ?? is the zero-length match, and the second best match is what is matched by \w. Thus zero-length matches alternate with one-character-long matches.

nota inoltre:

? Match 1 or 0 times
?? Match 0 or 1 times

in pratica ".?" significa matchare un carattere qualunque o anche nessuno, ".??" matchare nessun o un carattere qualunque.

per cui effettivamente la prima e la terza sono equivalenti, in quanto nella prima non viene preso in considerazione alcun carattere prima e dopo, nella terza si, ma prevale il match di zero caratteri. Nella seconda invece prevale la selezione di un carattere.

Mich_
07-10-2004, 18:13
Grazie Shishii. Mi stavo scervellando per una cosa che ora e` banale.

La spiegazione e` chiara e ragionevole.
Nota che il perlre lo consulto almeno una volta al giorno in questo periodo, ma non avevo mai trovato (forse e` meglio dire notato) quella frase.

Grazie ancora
Ciao
Michele

Loading