Re: Expression régulière...
Le 23/07/2007 11:54, Cenekemoi a écrit :
> Bonjour à Olivier Miakinen <om+news@miakinen.net> qui nous a écrit :
>> PHP est compatible PCRE, mais JavaScript n'est que compatible Perl.
>>
>>> Note que tout n'est pas perdu. Même si le flag U n'est pas reconnu,
>>> la syntaxe « *? » doit fonctionner pour faire la même chose :
>>>
>>> new RegExp("_DEB_.*?_FIN_", "gs");
>>
>> Ça c'est à la fois Perl et PCRE, donc ça doit marcher.
>
> Si on enlève le "s", tout baigne ! Merci beaucoup...
Pourtant, d'après la doc de PCRE c'est bien une option de Perl.
> Accessoirement, à quoi est sensé servir le "s" ci-dessus en Perl ?
<cit. http://www.pcre.org/pcre.txt>
PCRE_DOTALL
If this bit is set, a dot metacharater in the pattern matches all char-
acters, including those that indicate newline. Without it, a dot does
not match when the current position is at a newline. This option is
equivalent to Perl's /s option, and it can be changed within a pattern
by a (?s) option setting. A negative class such as [^a] always matches
newline characters, independent of the setting of this option.
</cit.>
Explication en français : par défaut, le métacaractère « point » peut
représenter n'importe quel caractère *sauf* un saut de ligne. Donc la
séquence « .* » ne peut pas aller au delà d'une seule ligne de texte.
Du coup, /_DEB_.*_FIN_/ fonctionnera sur ce premier exemple :
Essai_DEB_sur une seule ligne_FIN_.
.... mais pas sur le suivant :
Essai_DEB_sur
plusieurs
lignes_FIN_.
L'option /s (ou PCRE_DOTALL) permet de franchir les sauts de ligne.
> Maintenant, STP, pourrais-tu décrire le rôle dévolu à chacun des trois
> caractères ".*?", je te remercie d'avance
.. = n'importe quel caractère sauf les sauts de ligne (à moins de /s)
* = répéter ce qui précède n'importe quel nombre de fois (y compris
éventuellement 0 fois), et privilégier le résultat le plus long
si plusieurs sont possibles.
*? = idem * mais privilégier le résultat le plus court si plusieurs
sont possibles.
Par exemple, avec la chaîne "_DEB_xx_FIN_ uu _DEB_yy_FIN_" :
/_DEB_.*_FIN_/ --> le « .* » trouvera "xx_FIN_ uu _DEB_yy"
/_DEB_.*?_FIN_/ --> le « .*? » trouvera "xx", puis "yy".
> J'ai par ailleurs fini par trouver sur le web ta syntaxe mais encadrée
> par des parenthèses "(.*?)", quelle différence cela fait-il avec ta
> proposition ?
Aucune, puisque tu ne te sers pas de ces « parenthèses capturantes »
(qui retournent les valeurs trouvées dans \1, \2, \3, etc.). Elles
sont inutiles ici.
|