Afficher un message
Vieux 23/07/2007, 11h23   #4
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut 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.
  Réponse avec citation
 
Page generated in 0,05960 seconds with 9 queries