Traduction et exemples AutoIt: danielm
La syntaxe et la s�mantique des expressions r�guli�res qui sont prises en charge par PCRE sont d�crites en d�tail ci-dessous. Il y a un r�sum� de la syntaxe de r�f�rence dans la page pcresyntax. PCRE essaie de coller � la syntaxe et la s�mantique Perl aussi �troitement que possible. PCRE prend �galement en charge une syntaxe d'expression r�guli�re alternative (qui n�entre pas en conflit avec la syntaxe Perl) afin de fournir une certaine compatibilit� avec les expressions r�guli�res en Python, .NET et Oniguruma.
Les expressions r�guli�res Perl sont d�crites dans leur propre documentation, et les expressions r�guli�res en g�n�ral sont trait�es dans un certain nombre de livres, dont certains ont des exemples copieux. "Mastering Regular Expressions" de Jeffrey Friedl, publi� par O'Reilly, couvre les expressions r�guli�res dans les moindres d�tails. Cette description des expressions r�guli�res PCRE se veut un manuel de r�f�rence.
Un certain nombre d'options peuvent �tre d�finies par des �l�ments particuliers au d�but d'un mod�le. Plusieurs �l�ments peuvent appara�tre, mais ils doivent tous �tre ensemble d�s le d�but de la cha�ne mod�le.
PCRE op�rait � l'origine sur des cha�nes de caract�res d'un octet. Cependant, il y a maintenant aussi un support pour les cha�nes UTF-8 dans la biblioth�que d'origine, une biblioth�que suppl�mentaire prenant en charge les cha�nes de caract�res 16 bits et UTF-16, et une troisi�me biblioth�que qui prend en charge les cha�nes de caract�res 32 bits et UTF-32. Pour utiliser ces fonctionnalit�s, le mod�le PCRE doit commencer par l'une des s�quences sp�ciales suivantes:
(*UTF8) (*UTF16) (*UTF32) (*UTF)(*UTF) est une s�quence g�n�rique qui peut �tre utilis�e avec n'importe laquelle des biblioth�ques. La fa�on dont un mode UTF affecte le match d'un mod�le est mentionn�e � plusieurs endroits ci-dessous.
Une autre s�quence sp�ciale qui peut appara�tre au d�but d'un mod�le est (*UCP). Elle forcera des s�quences comme \d et \w � utiliser les propri�t�s Unicode pour d�terminer les types de caract�re, au lieu de reconna�tre seulement les caract�res de code inf�rieur � 128.
Si un mod�le commence avec (*NO_AUTO_POSSESS), il demande � PCRE d'arr�ter de rendre les quantificateurs possessifs quand ce qui suit ne peut pas matcher l'�l�ment r�p�t�. Par exemple, par d�faut a+b est trait� comme a++b.
Si un mod�le commence par (*NO_START_OPT), il d�sactive plusieurs optimisations pour atteindre rapidement les r�sultats "sans match".
PCRE soutient cinq conventions diff�rentes pour indiquer un retour � la ligne dans les cha�nes: le seul caract�re CR (carriage return), le seul caract�re LF (line feed), la s�quence des deux caract�res CRLF, l'une des trois pr�c�dentes, ou toute s�quence newline Unicode.
Il est �galement possible de sp�cifier une convention de newline en d�marrant un mod�le avec l'une des cinq s�quences suivantes:
(*CR) carriage return (*LF) linefeed (*CRLF) carriage return, suivi de linefeed (*ANYCRLF) n'importe quelle s�quence pr�c�dente (*ANY) toute s�quence newline UnicodeElles remplacent la valeur par d�faut. Par exemple, sur un syst�me Unix o� LF est la s�quence de saut de ligne par d�faut, le mod�le
(*CR)a.bchange la convention en CR. Ce mod�le matche "a\nb" parce que LF n'est pas un saut de ligne. Si plus d'un de ces param�tres est pr�sent, le dernier est utilis�.
La convention newline affecte la fa�on dont les assertions 'circonflexe' et 'dollar' sont vraies. Elle affecte aussi l'interpr�tation du m�tacaract�re 'dot' (le point) quand PCRE_DOTALL n'est pas d�fini, et le comportement de \N. Cependant, elle n'a pas d'incidence sur ce que matche la s�quence d'�chappement \R. Par d�faut, c'est une s�quence de saut de ligne Unicode, pour la compatibilit� Perl. Cependant, cela peut �tre chang� voir la description de \R dans la section intitul�e "S�quences Newline" suivante. Un changement du param�tre \R peut �tre combin� avec un changement de convention newline.
Il est possible de d�finir une limite sur le nombre de matchs et sur la profondeur maximale des appels r�cursifs. Ces possibilit�s sont pr�vues pour arr�ter des matches qui s'emballent � cause de mod�les avec d'�normes arborescence de matchs (un exemple typique est un mod�le avec des r�p�titions imbriqu�es illimit�es) et pour �viter de manquer de pile syst�me par trop de r�cursivit�. Lorsque l'une de ces limites est atteinte, StringRegExp() retourne une erreur. Les limites sont d�finies par des �l�ments au d�but du mod�le:
(*LIMIT_MATCH=d) (*LIMIT_RECURSION=d)o� d est un nombre quelconque de chiffres d�cimaux. Cependant la valeur d'un param�tre doit �tre inf�rieure � la valeur par d�faut pour avoir un effet. En d'autres termes le concepteur du mod�le baisser les limites d�finies par le programmeur, mais pas les augmenter. S'il y a plus d'un param�tre pour ces limites, la valeur la plus basse est utilis�e.
PCRE peut �tre compil� pour s'ex�cuter dans un environnement qui utilise EBCDIC comme code de caract�res plut�t que ASCII ou Unicode (g�n�ralement un syst�me mainframe). Dans les sections ci-dessous, les valeurs de code de caract�re sont ASCII ou Unicode; dans un environnement EBCDIC ces caract�res peuvent avoir des valeurs de code diff�rentes, et il n'y a pas de points de code sup�rieur � 255.
Une expression r�guli�re est un mod�le qui matche une cha�ne sujet de gauche � droite. La plupart des caract�res se repr�sentent eux-m�mes dans un mod�le, et matchent les caract�res correspondants dans le sujet. Comme exemple trivial, le mod�le:
Le renard brun rapidematche une partie de la cha�ne sujet qui est identique au mod�le. Lorsque le match est sp�cifi� insensible � la casse (?i), les lettres sont match�es ind�pendamment de la casse. Dans le mode UTF, PCRE interpr�te toujours la sensibilit� � la casse pour des caract�res dont la valeur est inf�rieure � 128, donc un match insensible � la casse est toujours possible. Pour des caract�res de code sup�rieur, la sensibilit� � la casse est prise en charge si PCRE est utilis� avec la propri�t� Unicode, mais pas autrement. Si vous voulez utiliser un match insensible � la casse pour des caract�res de code 128 et sup�rieur, vous devez vous assurer que PCRE est utilis� avec le support Unicode, ainsi qu'avec le support UTF.
La puissance des expressions r�guli�res provient de la possibilit� d'inclure des alternatives et des r�p�titions dans le mod�le. Celles-ci sont cod�es dans le mod�le par l'utilisation de m�ta-caract�res, qui ne sont pas interpr�t�s pour eux-m�mes mais sont interpr�t�s d'une mani�re sp�ciale.
Il existe deux ensembles diff�rents de m�ta-caract�res: ceux qui sont reconnus partout dans le mod�le, except� ceux entre crochets, et ceux qui sont reconnus entre crochets. En dehors des crochets, les m�ta-caract�res sont les suivants:
\ caract�re d'�chappement g�n�ral avec plusieurs utilisations ^ assertion de d�but de cha�ne (ou de ligne, en mode multi-ligne) $ assertion de fin de cha�ne (ou de ligne, en mode multi-ligne) . matche n�importe quel caract�re sauf newline (par d�faut) [ d�marre la d�finition d�une classe de caract�res | d�marre une branche alternative ( d�but d�un sous-mod�le ) fin d�un sous-mod�le ? �tend la signification de ( aussi quantificateur 0 ou 1 aussi quantificateurs qui minimise * quantificateur 0 ou plus + quantificateur 1 ou plus aussi "quantificateur possessif" { d�marre un quantificateur min/maxUne partie d'un mod�le entre crochets est appel�e une "classe de caract�res". Dans une classe de caract�res les seuls m�ta-caract�res sont:
\ Caract�re d'�chappement g�n�ral ^ n�gation de la classe, mais seulement en premier caract�re - indique une plage de caract�res [ classe de caract�res POSIX (uniquement si elle est suivie par la syntaxe POSIX) ] termine la classe de caract�resLes sections suivantes d�crivent l'utilisation de chacun des m�ta-caract�res.
Le caract�re backslash a plusieurs utilisations. Tout d'abord, s�il est suivi par un caract�re qui n�est pas un chiffre ou une lettre, il enl�ve toute signification sp�ciale que peut avoir ce caract�re. Cette utilisation de la barre oblique inverse comme caract�re d'�chappement s�applique � la fois � l'int�rieur et � l'ext�rieur des classes de caract�res.
Par exemple, si vous voulez matcher le caract�re *, vous �crivez \* dans le mod�le. L�action d��chapper un caract�re peut se faire pour un caract�re qui par ailleurs pourrait �tre interpr�t� comme un m�tacaract�re, mais pas n�cessairement, donc il est toujours plus s�r de faire pr�c�der un caract�re non-alphanum�rique par un backslash pour indiquer qu'il repr�sente lui-m�me. En particulier, si vous voulez matcher une barre oblique inverse, vous �crirez \\.
Dans un mode UTF, seuls les chiffres et les lettres ASCII ont une signification sp�ciale apr�s une barre oblique inverse. Tous les autres caract�res (en particulier, ceux dont le code est sup�rieur � 127) sont trait�s comme des litt�raux.
Si un mod�le est utilis� avec l'option x (PCRE_EXTENDED, qui permet d'introduire des commentaires dans un mod�le), les espaces dans le mod�le (autre que dans une classe de caract�res) et les caract�res entre un # en dehors d'une classe de caract�res et le saut de ligne suivant sont ignor�s. Un backslash peut �tre utilis�e pour inclure un espace ou un caract�re # comme partie du mod�le.
Si vous souhaitez supprimer la signification sp�ciale � partir d'une s�quence de caract�res, vous pouvez le faire en les mettant entre \Q et \E. Ceci est diff�rent de Perl en ce que $ et @ sont trait�s comme des litt�raux dans les s�quences \Q ... \E dans PCRE, alors que dans Perl, $ et @ provoque une interpolation de variable. Noter les exemples suivants:
Mod�les Matchs PCRE \Qabc$xyz\E abc$xyz \Qabc\$xyz\E abc\$xyz \Qabc\E\$\Qxyz\E abc$xyzLa s�quence \Q ... \E est reconnu � la fois � l�int�rieur et � l�ext�rieur des classes de caract�res. Un \E isol� qui n�est pas pr�c�d� par \Q est ignor�. Si \Q n�est pas suivi par \E plus loin dans le mod�le, l'interpr�tation litt�rale continue jusqu'� la fin du mod�le (o� \E est suppos� se trouver). Si \Q est � l'int�rieur d'une classe de caract�res, cela provoque une erreur, parce que la classe de caract�res n�est pas termin�e.
Une deuxi�me utilisation de l'antislash fournit un moyen de coder les caract�res non affichables dans les mod�les d'une mani�re visible. Il n'y a aucune restriction quant � l'apparition de caract�res non affichables, en dehors du z�ro binaire qui met fin � un mod�le, mais quand un mod�le est en cours de pr�paration en �ditant le texte, il est souvent plus facile d'utiliser l'une des s�quences d'�chappement suivantes que le caract�re binaire qu'elle repr�sente:
\a alarme, qui est, le caract�re BEL (hex 07) \cx "control-x", o� x est un caract�re ASCII \e escape (hex 1B) \f formfeed (hex 0C) \n linefeed (hex 0A) \r retour chariot (hex 0D) \t tabulation (hex 09) \0dd caract�re avec un code octal 0dd \ddd caract�re avec le code octal ddd, ou r�f�rence arri�re \o{ddd..} caract�re avec un code octal ddd.. \xhh caract�re avec le code hexad�cimal hh \x{hhh..} caract�re avec le code hexad�cimal hhh.. (mode non-JavaScript) \uhhhh caract�re avec le code hexad�cimal hhhh (mode JavaScript seulement)L'effet pr�cis de \cx sur des caract�res ASCII est le suivant: si x est une lettre minuscule, elle est convertie en majuscule. Ensuite, le bit 6 du caract�re (hex 40) est invers�. Ainsi \cA � \cZ devient hex 01 � hex 1A (A est 41, Z est 5A), mais \c{ devient hex 3B (le caract�re { est 7B), tandis que \c; devient hex 7B (; est 3B). Si l'�l�ment de donn�e (octet ou valeur 16-bit) qui suit \c a une valeur sup�rieure � 127, une erreur apparait. Cela verrouille les caract�res non-ASCII dans tous les modes.
La fonctionnalit� \c a �t� con�ue pour �tre utilis�e avec des caract�res ASCII, mais avec l'extension � Unicode elle est moins utile qu'elle l'�tait autrefois.
Apr�s \0 jusqu'� deux autres chiffres octaux sont lus. S'il y a moins de deux chiffres, seuls ceux qui sont pr�sents sont utilis�s. Ainsi la s�quence \0\x\07 sp�cifie deux z�ros binaires suivis d'un caract�re BEL (valeur de code 7). Assurez-vous de fournir deux chiffres apr�s le z�ro initial si le caract�re de mod�le qui suit est lui-m�me un chiffre octal.
L'�chappement \o doit �tre suivi d'une s�quence de chiffres octaux entre parenth�ses. Une erreur se produit si ce n'est pas le cas. Cet �chappement est une addition r�cente de Perl; il permet de sp�cifier des points de code de caract�res en nombres octaux sup�rieurs � 0777, et il permet �galement de sp�cifier sans ambiguit� les nombres octaux et les r�f�rences arri�re.
Pour plus de clart� et sans ambigu�t�, il est pr�f�rable d'�viter de faire suivre \ par un chiffre sup�rieur � z�ro. A la place, utilisez \o{} ou \x{} pour sp�cifier les caract�res nombres, et \g{} pour sp�cifier les r�f�rences arri�res. Les paragraphes suivants d�crivent l'ancienne syntaxe ambigu�.
Le traitement d'un backslash suivi d'un chiffre autre que 0 est compliqu�, et Perl a chang� dans les versions r�centes, entrainant PCRE � changer �galement. En dehors d'une classe de caract�res, PCRE lit un chiffre et tous les chiffres suivants sous forme de nombre d�cimal. Si le nombre est inf�rieur � 8, ou s'il y en a eu au moins autant de parenth�ses capturantes � gauche dans l'expression, la s�quence enti�re est prise comme r�f�rence arri�re. Une description de ce fonctionnement est donn�e plus loin � la suite des sous-mod�les entre parenth�ses.
A l'int�rieur d'une classe de caract�res, ou si le nombre d�cimal qui suit \ est sup�rieur � 7 et s�il n'y a pas eu de sous-mod�les capturants, PCRE traite \8 et \9 comme les caract�res litt�raux "8" et "9", et autrement re-lit jusqu'� trois chiffres octaux qui suivent le backslash, en les utilisant pour g�n�rer un caract�re de donn�es. Les chiffres suivants repr�sentent eux-m�mes. Par exemple:
\040 est une autre fa�on d'�crire un espace ASCII \40 est pareil, � condition qu'il y ait moins que 40 sous mod�les capturant pr�c�dents \7 est toujours une r�f�rence arri�re \11 peut �tre une r�f�rence arri�re, ou une autre fa�on d'�crire une tabulation \011 est toujours une tabulation \0113 est une tabulation suivi du caract�re "3" \113 peut �tre une r�f�rence arri�re, sinon le caract�re avec le code octal 113 \377 peut �tre une r�f�rence arri�re, sinon la valeur 255 (d�cimal) \81 est une r�f�rence arri�re ou les deux caract�res "8" et "1"Notez que les valeurs octales de 100 ou plus qui sont sp�cifi�es en utilisant cette syntaxe ne doivent pas �tre introduites par un z�ro, parce que pas plus de trois chiffres octaux sont lus.
Par d�faut, apr�s \x qui n'est pas suivi de {, de z�ro � deux chiffres hexad�cimaux sont lus (les lettres peuvent �tre en majuscule ou en minuscule). Un nombre quelconque de chiffres hexad�cimaux peuvent appara�tre entre \x{ et }. Si un caract�re autre qu'un chiffre hexad�cimal appara�t entre \x{ et }, ou s'il n'y a pas de terminaison }, une erreur se produit.
Si l'option PCRE_JAVASCRIPT_COMPAT est d�finie, l'interpr�tation de \x est comme d�crite ci-dessus seulement lorsqu'il est suivi de deux chiffres hexad�cimaux. Sinon, il matche un caract�re litt�ral "x". En mode JavaScript, le support de codes sup�rieurs � 256 est fourni par \u, qui doit �tre suivi par quatre chiffres hexad�cimaux; sinon, il matche le caract�re litt�ral "u".
Les caract�res dont la valeur est inf�rieure � 256 peuvent �tre d�finis avec une des deux syntaxes \x (ou par \u en mode JavaScript). Il n'y a pas de diff�rence dans la fa�on dont ils sont g�r�s. Par exemple, \xdc est exactement pareil que \x{dc} (ou \u00dc en mode JavaScript).
Les caract�res qui sont sp�cifi�es en utilisant des nombres octaux ou hexad�cimaux sont limit�s � certaines valeurs, de la fa�on suivante:
8-bit non-UTF mode moins que 0x100 8-bit UTF-8 mode moins que 0x10ffff et un point de code valide 16-bit non-UTF mode moins que 0x10000 16-bit UTF-16 mode moins que 0x10ffff et un codepoint valide 32-bit non-UTF mode moins que 0x100000000 32-bit UTF-32 mode moins que 0x10ffff et un codepoint valideLes points de code Unicode Invalides sont de 0xd800 � 0xdfff (dit points de code "surrogate", de substitution), et 0xffef.
Toute s�quence qui d�finit une valeur de caract�re isol� Peut �re utilis�e aussi bien dans une classe de caract�re qu'en dehors. De plus, dans une classe de caract�re, \b est interpr�t� comme le caract�re backspace (hex 08).
\N n'est pas autoris� dans une classe de caract�re. \B, \R, and \X ne sont pas sp�ciaux dans une classe de caract�re. Comme d'autres s�quences d'�chappement non reconnues, elles sont trait�es comme les caract�res litt�raux "B", "R", and "X" par d�faut, mais provoque une erreur si l'option PCRE_EXTRA est d�finie. En dehors d'une classe de caract�re, ces s�quences ont des significations diff�rentes.
En Perl, les s�quences \l, \L, \u et \U sont reconnus par son gestionnaire de cha�ne et utilis� pour modifier la casse des caract�res qui suivent. Par d�faut, PCRE ne supporte pas ces s�quences d'�chappement.
La s�quence \g suivie d'un nombre non sign� ou d�un nombre n�gatif, �ventuellement encadr� par des accolades, est une r�f�rence arri�re absolue ou relative. Une r�f�rence arri�re nomm�e peut �tre cod� par \g{name}. Les r�f�rences arri�res sont �tudi�es plus loin, apr�s les sous-mod�les parenth�s�s.
Pour la compatibilit� avec Oniguruma, la syntaxe non-Perl \g suivie d'un nom ou d�un nombre encadr� par des crochets ou des guillemets simples, est une syntaxe alternative pour r�f�rencer un sous-mod�le comme un "sous-programme". Les d�tails sont �tudi�s plus loin.. Notez que \g{...} (syntaxe Perl) et \g<...> (syntaxe Oniguruma) ne sont pas synonymes. Le premier est une r�f�rence arri�re; le dernier est un appel � un sous-programme.
Une autre utilisation de l'antislash est la sp�cification d�un type de caract�res g�n�rique:
\d un chiffre d�cimal \D tout caract�re qui est pas un chiffre d�cimal \h tout caract�re d�espacement horizontal \H tout caract�re qui n�es pas un caract�re d�espacement horizontal \s tout caract�re d�espacement \S tout caract�re qui n�est pas un caract�re d�espacement \v tout caract�re d�espacement vertical \V tout caract�re qui n�est pas un caract�re d�espacement vertical \w tout caract�re de "mot" \W tout caract�re qui n�est pas un caract�re "mot"Il y a aussi la s�quence \N, qui matche un caract�re qui n�est pas un newline. Ceci est identique au m�ta-caract�re "." quand PCRE_DOTALL n�est pas activ�. Perl utilise aussi \N pour matcher des caract�res par nom; PCRE ne supporte pas cela.
Chaque paire de s�quences d��chappement de minuscule et majuscule partitionne l'ensemble des caract�res en deux ensembles disjoints. Chaque caract�re donn� matche une, et une seule, de chaque paire. Les s�quences peuvent appara�tre � la fois � l'int�rieur et � l'ext�rieur des classes de caract�res. Elles matchent chacune un caract�re du type appropri�. Si le point du match est � la fin de la cha�ne sujet, elles �chouent toutes les deux, parce qu'il n'y a pas de caract�re � matcher.
Pour la compatibilit� avec Perl, \s ne matche pas le caract�re VT (code 11), ce qui le rend diff�rent de la classe POSIX "space". Cependant, Perl a ajout� VT � la version 5.18, et PCRE a suivi � la version 8.34. Par d�faut, les caract�res \s sont HT (9), LF (10), VT (11), FF(12), CR(13), et space(32) qui sont d�finis comme espace blancs dans la locale "C". Cette liste peut varier si un match sp�cifique aux param�tres r�gionaux est demand�. Par exemple, dans certains locales, le caract�re "espace ins�cable" (\xA0) est reconnu comme espace blanc, et dans d'autres le caract�re VT ne l'est pas.
Un caract�re de "mot" est le caract�re de soulignement ou tout caract�re qui est une lettre ou un chiffre. Par d�faut, la d�finition des lettres et des chiffres est contr�l�e par des tables de caract�res de valeurs basses de PCRE, et peut varier si un match sp�cifique � la localisation a lieu (voir "Support des param�tres r�gionaux" dans la page pcreapi. Par exemple, dans la locale French telle que "fr_FR" dans les syst�mes de type Unix, ou "french" dans Windows, certains codes de caract�res sup�rieurs � 127 sont utilis�s pour les caract�res accentu�s, et ceux - ci sont ensuite match�s par \w. L'utilisation des param�tres r�gionaux avec Unicode est d�conseill�e.
Par d�faut, les caract�res dont le code est sup�rieur � 128 ne matchent jamais \d, \s ou \w, et matchent toujours \D, \S, et \W, bien que cela puisse varier pour les caract�res dans la plage 128-255 lorsqu'un match sp�cifique � des param�tres r�gionaux se produit. Ces s�quences d'�chappement conservent leurs significations originales d�avant que le support UTF soit disponible, principalement pour des raisons d'efficacit�. Si PCRE est compil� avec le support Unicode, et si l'option PCRE_UCP est activ�e, le comportement est modifi� de sorte que les propri�t�s Unicode soient utilis�es pour d�terminer les types de caract�res, comme suit:
\d tout caract�re qui matche \p{Nd} (chiffre d�cimal) \s tout caract�re qui matche \p{Z}, ou \h ou \v \w tout caract�re qui matche \p{L} ou \p{N}, plus soulignementLes �chappements en majuscule matchent les ensembles compl�mentaires des caract�res. Notez que \d matche uniquement des chiffres d�cimaux, alors que \w matche tout chiffre Unicode, ainsi que toute lettre Unicode et le caract�re de soulignement. Notez �galement que PCRE_UCP affecte \b et \B parce qu'ils sont d�finis en termes de \w et \W. Le match de ces s�quences est sensiblement plus lent lorsque PCRE_UCP est activ�.
Les s�quences \h, \H, \v, et \V sont des caract�ristiques qui ont �t� ajout�es � Perl dans la version 5.10. Contrairement aux autres s�quences, qui matchent uniquement des caract�res ASCII par d�faut, celles-ci matchent toujours certains code de valeur haute, que PCRE_UCP soit activ� ou pas. Les espaces horizontaux sont:
U+0009 Tabulation horizontale U+0020 Espace U+00A0 Espace ins�cable U+1680 Marque d�espace Ogham U+180E S�parateur de voyelle Mongolian U+2000 En quad U+2001 Em quad U+2002 Espace En U+2003 Espace Em U+2004 Espace Trois-per-em U+2005 Espace Quatre-per-em U+2006 Espace Six-per-em U+2007 Espace Figure U+2008 Epace Ponctuation U+2009 Epace �troit U+200A Espace Hair U+202F Narrow ins�cable rapproch� U+205F Espace moyen math�matique U+3000 Espace id�ographiqueLes espaces verticaux sont:
U+000A Linefeed (LF) U+000B Tabulation verticale (VT) U+000C Formfeed (FF) U+000D Carriage return (CR) U+0085 Ligne suivante (NEL) U+2028 S�parateur Ligne U+2029 S�parateur ParagrapheEn mode 8-bit, non-UTF-8, seuls les caract�res avec code inf�rieur � 256 sont pertinents.
En dehors d'une classe de caract�res, par d�faut, la s�quence d'�chappement \R matche toute s�quence de saut de ligne Unicode. En mode 8 bits non-UTF-8 \R est �quivalent � ce qui suit:
(?> \r\n | \n | \x0b | \f | \r | \x85)Ceci est un exemple d'un "groupe atomique", dont les d�tails sont donn�s ci-dessous. Ce groupe particulier matche soit � la s�quence de deux caract�res CR suivie de LF, ou un des caract�res LF (linefeed, U+000A), VT (vertical tab, U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), ou NEL (next line, U+0085). La s�quence de deux caract�res est trait�e comme une entit� qui ne peut pas �tre divis�e.
Dans les autres modes, deux caract�res suppl�mentaires dont les codes sont sup�rieurs � 255 sont ajout�s: LS (s�parateur de ligne, U+2028) et PS (s�parateur de paragraphe, U+2029). Le support des caract�res Unicode n�est pas n�cessaire pour que ces caract�res soient reconnus.
Il est possible de restreindre \R pour matcher uniquement CR, LF ou CRLF (au lieu de l'ensemble complet des fins de ligne Unicode) en d�marrant un mod�le avec l'une des s�quences suivantes (BSR est l'abr�viation de "BackSlash \R"):
(*BSR_ANYCRLF) CR, LF, or CRLF seulement (*BSR_UNICODE) toute s�quence newline UnicodeCelles-ci remplacent les valeurs par d�faut. Notez que ces param�tres sp�ciaux, qui ne sont pas compatibles Perl, ne sont reconnus qu�au d�but d'un mod�le, et qu'ils doivent �tre en majuscules. Si plus d'un d'entre eux est pr�sent, le dernier est utilis�. Ils peuvent �tre combin�s avec un changement de convention newline; par exemple, un mod�le peut commencer par:
(*ANY) (*BSR_ANYCRLF)Ils peuvent �galement �tre combin�s avec les s�quences sp�ciales (*UTF8), (*UTF16), (*UTF32), (*UTF) ou (*UCP). A l'int�rieur d'une classe de caract�res, \R est trait� comme une s�quence d'�chappement non reconnue, et ainsi matche la lettre "R" par d�faut, mais provoque une erreur si PCRE_EXTRA est activ�.
Lorsque l'option Unicode est active, trois s�quences d'�chappement suppl�mentaires qui matchent des caract�res avec des propri�t�s sp�cifiques sont disponibles. En mode 8-bit non-UTF-8, ces s�quences sont bien s�r limit�es aux caract�res d'essais dont les codes sont inf�rieurs � 256, mais ils fonctionnent dans ce mode. Ces s�quences d'�chappement suppl�mentaires sont:
\p{xx} un caract�re avec la propri�t� xx \P{xx} un caract�re SANS la propri�t� xx \X un �l�ment graph�me �tendue UnicodeLes noms des propri�t�s repr�sent�s par xx ci-dessus sont limit�es aux noms des scripts Unicode, la cat�gorie g�n�rale des propri�t�s, "Any", qui matche tout caract�re (y compris newline), et quelques propri�t�s sp�ciales d�crites dans la section suivante). D'autres propri�t�s Perl comme "InMusicalSymbols" ne sont pas actuellement pris en charge par PCRE. Notez que \P{Any} ne matche pas tous les caract�res, donc provoque toujours un �chec de match.
Les ensembles de caract�res Unicode sont d�finis comme appartenant � certains scripts. Un caract�re d'un de ces ensembles peut �tre match� en utilisant un nom de script. Par exemple:
\p{Greek} \P{Han}Ceux qui ne font pas partie d'un script identifi� sont regroup�s comme "commun". La liste actuelle des scripts est:
Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Carian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cuneiform, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hieroglyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscriptional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Linear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Shavian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, Yi.
Chaque caract�re a exactement une propri�t� de cat�gorie g�n�rale Unicode, sp�cifi�e par une abr�viation de deux lettres. Pour la compatibilit� avec Perl, la n�gation peut �tre sp�cifi� en incluant un accent circonflexe entre l'accolade d'ouverture et le nom de la propri�t�. Par exemple, \p{^Lu} est identique � \P{Lu}.
Si une seule lettre est sp�cifi�e avec \p ou \P, il est inclut toutes les propri�t�s de cat�gories g�n�rales qui commencent par cette lettre. Dans ce cas, en l'absence de n�gation, les accolades dans la s�quence d'�chappement sont facultatives; ces deux exemples ont le m�me effet:
\p{L} \pLLes codes des propri�t�s des cat�gories g�n�rales suivants sont support�s:
C Autres Cc Contr�le Cf Format Cn Unassigned Co Utilisation r�serv�e Cs Surrogate L Lettre Ll Lettre minuscule Lm Lettre modifi�e Lo Autre lettre Lt Lettre en casse Titre Lu Lettre majuscule M Marque Mc Marque d�espacement Me Marque d�encadrement Mn Marque non-espacement N Nombre Nd Nombre d�cimal Nl Nombre lettre No Autre nombre P Ponctuation Pc Ponctuation de connexion Pd Ponctuation Dash Pe Ponctuation de fermeture Pf Ponctuation finale Pi Ponctuation initiale Po Autres signes de ponctuation Ps Ponctuation d�ouverture S Symbole Sc Symbole mon�taire Sk Symbole Modificateur Sm Symbole math�matique So Autre symbole Z S�parateur Zl S�parateur de Ligne Zp S�parateur de Paragraphe Zs S�parateur EspaceLa propri�t� sp�ciale L& est �galement soutenue: elle matche un caract�re qui a la propri�t� Lu, Ll ou Lt, en d'autres termes, une lettre qui est pas class� comme un modificateur ou "autre".
La propri�t� Cs (Surrogate) s�applique uniquement aux caract�res de la plage U+D800 � U+DFFF. Ces caract�res ne sont pas valides dans les cha�nes Unicode et ne peuvent donc pas �tre test�s par PCRE, � moins que le contr�le de validit� UTF ait �t� d�sactiv� (voir le propos PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK et PCRE_NO_UTF32_CHECK dans la page pcreapi). Perl ne supporte pas la propri�t� Cs.
Les synonymes longs des noms de propri�t�s que Perl soutient (comme \p{Lettre}) ne sont pas pris en charge par PCRE, pas plus que le pr�fixe de l'une de ces propri�t�s avec "Is".
Aucun caract�re qui est dans la table Unicode a la propri�t� Cn (unassigned). Au lieu de cela, cette propri�t� est soutenue pour tout code qui n�est pas dans la table Unicode.
La sp�cification insensible � la casse d�un match n'affecte pas ces s�quences d'�chappement. Par exemple, \p{Lu} matche toujours uniquement des lettres majuscules. Ceci est diff�rent du comportement des versions courantes de Perl.
Le match des caract�res par propri�t�s Unicode n'est pas rapide, car PCRE doit effectuer des recherches de table � plusieurs �tages afin de trouver la propri�t� d'un caract�re. C'est pourquoi les s�quences d'�chappement traditionnelles telles que \d et \w n'utilisent pas les propri�t�s Unicode dans PCRE par d�faut, mais vous pouvez les faire en d�marrant le mod�le avec (*UCP).
L��chappement \X matche un certain nombre de caract�res Unicode qui forment un "extended grapheme cluster", et traite la s�quence comme un groupe atomique (voir ce qui suit). Jusqu'� la version 8.31 incluse, PCRE utilisait une d�finition ant�rieure plus simple qui �tait �quivalente �:
(?>\PM\pM*)Autrement dit, il correspond � un caract�re sans la propri�t� "mark", suivi par z�ro ou plusieurs caract�res avec la propri�t� "Mark". Les caract�res avec la propri�t� "mark" sont g�n�ralement des accents qui affectent le caract�re pr�c�dent.
Cette d�finition simple a �t� �tendue en Unicode pour inclure des sortes plus compliqu�es de caract�res composites en donnant � chaque caract�re une propri�t� de rupture de graph�me, et en cr�ant des r�gles qui utilisent ces propri�t�s pour d�finir les limites des groupes de graph�mes �tendues. Dans les versions de PCRE ult�rieures � 8.31, \X matche un de ces groupes.
\X matche toujours au moins un caract�re. Ensuite, il d�cide d'ajouter ou non des caract�res suppl�mentaires selon les r�gles suivantes pour mettre fin � un groupe:
1. Fin � la fin de la cha�ne de sujet.
2. Ne pas se terminer entre CR et LF; sinon se terminer apr�s tout caract�re de contr�le.
3. Ne cassez pas les s�quences de syllabes Hangul (un script Korean). Les caract�res Hangul sont de cinq types: L, V, T, LV et LVT. Un caract�re L peut �tre suivi d'un caract�re L, V, LV ou LVT; un caract�re LV ou V peut �tre suivi d'un caract�re V ou T; un caract�re LVT ou T ne peut �tre suivi que d'un caract�re T.
4. Ne se termine pas avant l'extension des caract�res ou les marques d'espacement. Les caract�res avec la propri�t� "mark" poss�de toujours la propri�t� de rupture de graph�me "extend".
5. Ne pas se terminer apr�s avoir pr�fix� un caract�re.
6. Sinon, terminer le cluster.
En plus des propri�t�s Unicode standards d�crites dans la section pr�c�dente, PCRE soutient quatre autres prppri�t�s qui permettent de convertir des s�quences d'�chappement traditionnelles telles que \w et \s pour utiliser les propri�t�s Unicode. PCRE utilise ces propri�t�s non-standards, non-Perl en interne lorsque PCRE_UCP est activ�. Ces propri�t�s sont:
Xan Tout caract�re alphanum�rique Xps Tout caract�re d'espace POSIX Xsp Tout caract�re d'espace Perl Xwd Tout caract�re "mot" PerlXan matche des caract�res qui ont soit la propri�t� L (lettre) ou N (nombre). Xps matche les caract�res tab, linefeed, vertical tab, formfeed ou carriage return, et tout autre caract�re qui a la propri�t� Z (s�parateur). Xsp est pareil que Xps; il est utilis� pour exclure vertical tab, pour la compatibilit� Perl, mais Perl a chang�, et donc PCRE a suivi � la version 8.34. Xwd matche les m�mes caract�res que Xan, plus le caract�re de soulignement.
Il existe une autre propri�t� non standard, Xuc, qui matche n'importe quel caract�re qui peut �tre repr�sent� par un nom de caract�re universel en C++ et autre langage de programmation. Ce sont les caract�res $, @, `(accent grave) et tous les caract�res avec des points de code Unicode sup�rieurs ou �gaux � U + 00A0, � l'exception des surrogates U+D800 � U+DFFF. Notez que la plupart des caract�res de base (ASCII) sont exclus. (Les noms de caract�res universels sont de la forme des s�quences \uHHH ou \UHHHHHHHH o� H est un chiffre hexad�cimal. Notez que la propri�t� Xuc ne matche pas ces s�quences mais les caract�res qu'ils repr�sentent.)
La s�quence d'�chappement \K fait que tous les caract�res pr�c�demment match�s ne seront pas inclus dans la s�quence match�e, finale. Dans l�exemple:
ConsoleWrite(StringRegExp('abcdef', 'abc\Kdef', 1)[0] & @crlf) ; defle mod�le matche "abcdef", mais rapporte qu'il a match� "def". Ce comportement est similaire � l'assertion lookbehind (d�crite plus loin). Toutefois, dans ce cas, la partie du sujet avant le vrai match n'a pas � �tre de longueur fixe, comme c�est le cas dans les assertions lookbehind. L'utilisation de \K n�interf�re pas avec la d�finition des sous-cha�nes captur�es. Dans l'exemple:
$regex = "(?x) (abc) \K de(f)" _ArrayDisplay(StringRegExp("abcdef", $regex, 4)[0]) ; defle mod�le matche "def", mais la premi�re cha�ne captur�e est "abc".
Perl documente l'utilisation de \K dans les assertions en pr�cisant qu�elle "n�est pas bien d�fini". Dans PCRE, \K est trait� quand il apparait � l'int�rieur des assertions positives, mais est ignor� dans les assertions n�gatives. Notez que lorsqu'un mod�le comme (?=ab\K) matche, le d�but rapport� du match peut �tre plus grand que la fin du match.
L'utilisation finale de l'antislash concerne certaines assertions simples. Une assertion sp�cifie une condition qui doit �tre remplie � un point particulier d�un match, sans consommer les caract�res de la cha�ne sujet. L'utilisation de sous-mod�les pour des assertions plus complexes est d�crite ci-dessous. Les assertions avec backslash sont:
\b matche � la limite d�un mot \B matche lorsque ce n�est pas la limite d�un mot \A matche au d�but de la cha�ne sujet \Z matche � la fin de la cha�ne sujet matche aussi avant un saut de ligne � la fin du sujet \z matche seulement � la fin du sujet \G matche � la premi�re position du match dans le sujetA l'int�rieur d'une classe de caract�res, \b a une signification diff�rente; il matche le caract�re backspace. Si une autre de ces assertions appara�t dans une classe de caract�res, par d�faut, il matche le caract�re litt�ral correspondant (par exemple, \B matche la lettre B). Cependant, si l'option PCRE_EXTRA est d�finie, une erreur "s�quence d'�chappement invalide" est g�n�r�e � la place.
Une limite de mot est une position dans la cha�ne sujet o� le caract�re courant et le caract�re pr�c�dent ne matche pas � la fois \w et \W (i.e. un doit matcher \w et l�autre doit matcher \W), ou le d�but ou la fin de la cha�ne si le premier ou le dernier caract�re matche \w, respectivement. Dans un mode UTF, les significations de \w et \W peuvent �tre modifi�s en d�finissant l'option PCRE_UCP. Lorsque cela est fait, il affecte aussi \b et \B. Ni PCRE, ni Perl disposent de m�ta-s�quence "d�but de mot" et "fin du mot" diff�rentes. Cependant, quel que soit ce qui suit \b normalement d�termine ce qu'il est. Par exemple, le fragment \ba matche "a" au d�but d'un mot.
Les assertions \A, \Z, et \z diff�rent du circonflexe traditionnel et du caract�re dollar (d�crit dans la section suivante) en ce sens qu'ils ne matchent jamais au tout d�but et � la fin de la cha�ne sujet, quelles que soient les options qui sont d�finies. Ainsi, ils sont ind�pendants du mode multiligne. Ces trois assertions ne sont pas affect�es par les options PCRE_NOTBOL ou PCRE_NOTEOL, qui affectent seulement le comportement des m�tacaract�res circonflexe et dollar. Toutefois, si l�argument startOffset de pcre_exec () n�est pas nul, ce qui indique que le match doit commencer � un point autre que le d�but du sujet, \A ne peut jamais matcher. La diff�rence entre \Z et \z est que \Z matche avant un saut de ligne � la fin de la cha�ne, ainsi que tout � la fin, alors que \z matche seulement � la fin.
L'assertion \G est vrai seulement lorsque la position du match actuel est au point de d�part du match, comme sp�cifi� par l�argument startOffset de pcre_exec() . Elle se distingue de \A lorsque la valeur de startOffset est non nul. En appelant pcre_exec () plusieurs fois avec des arguments appropri�s, vous pouvez imiter l�option /g de Perl, et c�est dans ce genre de mise en �uvre que \G peut �tre utile.
Notez, cependant, que l'interpr�tation PCRE de \G, comme le d�but du match en cours, est subtilement diff�rent de celui de Perl, qui le d�finit comme la fin du match pr�c�dent. En Perl, ceci peut �tre diff�rent lorsque la cha�ne match�e pr�c�demment �tait vide. Parce que PCRE fait juste un match � la fois, il ne peut pas reproduire ce comportement.
Si toutes les alternatives d'un mod�le commencent par \G, l'expression est ancr�e � la position de match de d�part, et le flag "anchored" est d�fini dans l'expression r�guli�re compil�e.
Les m�tacaract�res circonflexe et dollar sont des assertions de largeur nulle. Ce qui signifie qu'ils testent si une condition particuli�re est vraie sans consommer de caract�re dans la cha�ne de sujet.
En dehors d'une classe de caract�res, dans le mode de match par d�faut, le caract�re circonflexe est une assertion qui est vraie que si le point de match actuel est au d�but de la cha�ne sujet. Si l�argument startOffset de pcre_exec () n�est pas nul, circonflexe ne peut jamais matcher si l'option PCRE_MULTILINE n�est pas activ�e. A l'int�rieur d'une classe de caract�res, circonflexe a un tout autre sens (voir ci-dessous).
Circonflexe n'a pas besoin d'�tre le premier caract�re du mod�le si un certain nombre d'alternatives sont impliqu�s, mais il devrait �tre le premier de chaque alternative dans laquelle il doit appara�tre si le mod�le est toujours de matcher cette branche. Si toutes les alternatives possibles commencent avec un circonflexe, ce qui est le cas si le mod�le est contraint de matcher seulement au d�but du sujet, il est d�clar� �tre un mod�le "ancr�". (Il existe �galement d'autres constructions qui peuvent faire un mod�le ancr�.)
Le caract�re dollar est une assertion qui est vraie seulement si le point de match en cours est � la fin de la cha�ne sujet, ou imm�diatement avant un saut de ligne � la fin de la cha�ne (par d�faut). Dollar ne doit pas �tre le dernier caract�re du mod�le si des alternatives sont impliqu�es, mais il doit �tre le dernier caract�re de chaque branche dans laquelle il doit apparaitre. Dollar n'a pas de signification particuli�re dans une classe de caract�res.
La signification du dollar peut �tre modifi�e afin qu'il matche seulement la fin de la cha�ne, en d�finissant l'option PCRE_DOLLAR_ENDONLY au moment de la compilation. Cela n'a aucune incidence sur l'assertion \Z.
Les significations des caract�res circonflexe et dollar sont modifi�es si l'option PCRE_MULTILINE est activ�e. Lorsque tel est le cas, un circonflexe matche imm�diatement apr�s des sauts de ligne interne aussi bien qu'au d�but de la cha�ne sujet. Il ne matche pas � la suite d'un saut de ligne qui termine la cha�ne. Un dollar matche avant tout saut de ligne dans la cha�ne, ainsi que tout � la fin, lorsque PCRE_MULTILINE est activ�e. Lorsque newline est sp�cifi� comme la s�quence de deux caract�res CRLF, les caract�res CR et LF isol�s n�indique pas un saut de ligne.
Par exemple, le mod�le ^abc$ matche la cha�ne "def\nabc" (o� \n repr�sente un saut de ligne) en mode multiligne, mais pas autrement. Par cons�quent, les mod�les qui sont ancr�s en mode ligne unique parce que toutes les branches commencent par ^ ne sont pas ancr�s dans le mode multiligne, et un match pour circonflexe est possible lorsque l�argument startOffset de pcre_exec() est non nul. L'option PCRE_DOLLAR_ENDONLY est ignor�e si PCRE_MULTILINE est activ�e.
Notez que les s�quences \A, \Z, et \z peuvent �tre utilis�s pour matcher le d�but et la fin du sujet dans les deux modes, et si toutes les branches d'un mod�le commencent par \A, il est toujours ancr�e, que PCRE_MULTILINE soit activ�e ou pas.
En dehors d'une classe de caract�res, un point dans un mod�le matche un seul caract�re dans la cha�ne sujet, sauf (par d�faut) un caract�re qui signifie la fin d'une ligne.
Quand une fin de ligne est d�finie comme un seul caract�re, le point ne matche jamais ce caract�re; lorsque la s�quence de deux caract�res CRLF est utilis�e, le point ne matche pas CR si il est imm�diatement suivi par LF, mais sinon, il matche tous les caract�res (y compris les CRs et LFs isol�s). Lorsque les fins de ligne Unicode sont reconnus, le point ne matche pas CR ou LF ou d�autres caract�res de fin de ligne.
Le comportement du point � l'�gard de newline peut �tre modifi�. Si l'option PCRE_DOTALL est activ�e, un point matche un seul caract�re, sans exception. Si la s�quence de deux caract�res CRLF est pr�sente dans la cha�ne sujet, il faudra deux points pour la matcher.
Le traitement du point est tout � fait ind�pendant du traitement du circonflexe et dollar, la seule relation est que les deux impliquent un saut de ligne. Le point n'a pas de signification particuli�re dans une classe de caract�res.
La s�quence d'�chappement \N se comporte comme un point, sauf qu'elle n'est pas affect�e par l'option PCRE_DOTALL. En d'autres termes, elle matche tout caract�re sauf un caract�re qui signifie fin d'une ligne. Perl utilise aussi \N pour matcher des caract�res par nom; PCRE ne supporte pas cela.
En dehors d'une classe de caract�res, la s�quence d'�chappement \C matche � toute une unit� de donn�es, que ce soit ou non avec un mode UTF activ�. Dans la biblioth�que 8 bits, une unit� de donn�es est un octet; dans la biblioth�que 16 bits, une unit� de 16 bits; dans la biblioth�que 32 bits, une unit� de 32 bits. Contrairement au point, \C matche toujours des caract�res de fin de ligne. La fonctionnalit� est fournie en Perl afin de faire correspondre les octets individuels en mode UTF-8, mais on ne sait pas comment il peut �tre utilement utilis�. Parce que \C d�compose les caract�res en unit�s de donn�es individuelles, matchant une unit� avec \C en mode UTF signifie que le reste de la cha�ne peut commencer par un caract�re UTF malform�. Cela a des r�sultats impr�vus, parce PCRE suppose qu'il traite avec des cha�nes UTF valides (et par d�faut, il v�rifie cela au d�but du traitement, sauf si l'option PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK ou PCRE_NO_UTF32_CHECK est activ�e).
PCRE n'autorise pas \C dans des assertions arri�res (d�crites ci-dessous dans un mode UTF, parce que cela rendrait impossible le calcul de la longueur de lookbehind.
En g�n�ral, il est pr�f�rable d'�viter la s�quence d'�chappement \C. Cependant, une fa�on de l'utiliser qui permet d'�viter le probl�me des caract�res UTF malform�s est d'utiliser un lookahead pour v�rifier la longueur du caract�re suivant, comme dans ce mod�le, qui pourrait �tre utilis� avec une cha�ne UTF-8 (ignorer les espaces et les sauts de ligne):
(?| (?=[\x00-\x7f])(\C) | (?=[\x80-\x{7ff}])(\C)(\C) | (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) | (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))Un groupe qui commence par (|? r�initialise les num�ros des parenth�ses de capture dans chaque alternative (voir "Num�ros de sous-mod�les dupliqu�" ci-dessous). Les assertions au d�but de chaque branche testent les caract�res UTF-8 suivants pour les valeurs dont le codage utilise 1, 2, 3, ou 4 octets, respectivement. Les octets individuels du caract�re sont alors captur�s par le nombre appropri� de groupes.
Un crochet ouvrant introduit une classe de caract�res, termin�e par un crochet fermant. Un crochet fermant sur lui-m�me n'est pas sp�cial par d�faut. Cependant, si l'option PCRE_JAVASCRIPT_COMPAT est d�finie, un crochet fermant seul provoque une erreur de compilation. Si un crochet de fermeture est n�cessaire en tant que membre de la classe, il doit �tre le premier caract�re de donn�es dans la classe (apr�s un circonflexe initial, le cas �ch�ant) ou �chapp� avec un backslash.
Une classe de caract�res matche un seul caract�re dans le sujet. Dans un mode UTF, le caract�re peut avoir plus d'une unit� de donn�es de longueur. Un caract�re match� doit �tre dans le jeu de caract�res d�finis par la classe, � moins que le premier caract�re dans la d�finition de la classe soit un circonflexe, auquel cas le caract�re du sujet ne doit pas �tre dans l'ensemble d�fini par la classe. Si un circonflexe est n�cessaire en tant que membre de la classe, assurez-vous qu'il ne soit pas le premier caract�re, ou �chappez-le avec un backslash.
Par exemple, la classe de caract�res [aeiou] matche toute voyelle minuscule, alors que [^aeiou] matche tout caract�re qui n'est pas une voyelle minuscule. Notez qu'un circonflexe est juste une notation pratique pour sp�cifier les caract�res qui sont dans la classe en �num�rant ceux qui n'y sont pas. Une classe qui commence par un circonflexe n'est pas une assertion; il consomme encore un caract�re de la cha�ne sujet, et donc il �choue si le pointeur courant est � la fin de la cha�ne.
En mode UTF-8 (UTF-16, UTF-32), des caract�res avec des valeurs sup�rieures � 255 (0xffff) peuvent �tre inclus dans une classe comme une cha�ne litt�rale d'unit�s de donn�es, ou en utilisant le m�canisme d'�chappement \x{ .
Lorsque le match est d�fini insensible � la casse, toutes les lettres dans une classe repr�sentent � la fois les versions majuscules et minuscules, de sorte que par exemple, [aeiou] matche "A" ainsi que "a", et [^aeiou] ne matche pas "A", alors qu'une version sensible � la casse le ferait. Dans un mode UTF, PCRE comprend toujours le concept de casse pour les caract�res dont les valeurs sont inf�rieures � 128, donc un match insensible � la casse est toujours possible. Pour les caract�res avec des valeurs plus �lev�es, le concept de casse est pris en charge si PCRE est compil� avec le support de propri�t� Unicode, mais pas autrement. Si vous voulez utiliser un match insensible � la casse en mode UTF pour les caract�res 128 et au-dessus, vous devez vous assurer que PCRE est compil� avec le support de propri�t� Unicode, ainsi qu'avec le support UTF.
Les caract�res qui pourraient indiquer les sauts de ligne ne sont jamais trait�s d'une mani�re particuli�re lors du match des classes de caract�res, quelle que soit la s�quence de fin de ligne en cours d'utilisation, et quel que soit le r�glage des options PCRE_DOTALL et PCRE_MULTILINE. Une classe telle que [^a] matche toujours un de ces caract�res.
Le caract�re moins (tiret) peut �tre utilis� pour sp�cifier une plage de caract�res dans une classe de caract�res. Par exemple, [d-m] matche toute lettre entre d et m inclus. Si un caract�re moins est n�cessaire dans une classe, il doit �tre �chapp� avec un backslash ou apparaitre dans une position o� il ne peut pas �tre interpr�t�e comme indiquant une plage, g�n�ralement comme le premier ou le dernier caract�re de la classe, ou imm�diatement apr�s une plage. Par exemple, [b-d-z] matche les lettres entre b et d, le caract�re tiret, ou z.
Il est impossible d'avoir le caract�re litt�ral "]" comme caract�re de fin d'une plage. Un mod�le tel que [W-\]46] est interpr�t� comme une classe de deux caract�res ("W" et "-") suivi d'une cha�ne litt�rale "46]", il matche "W46]" ou "-46]". Toutefois, si le "]" est �chapp� avec un backslash il est interpr�t� comme la fin de la plage, donc [W-\]46] est interpr�t� comme une classe contenant une plage suivie par deux autres caract�res. La repr�sentation octale ou hexad�cimale de "]" peut �galement �tre utilis� pour terminer une plage.
Une erreur est lev�e si une classe de caract�re POSIX (voir ci-dessous) ou une s�quence d'�chappement autre que celle qui d�finit un seul caract�re appara�t � un point o� un caract�re de fin de plage est attendu. Par exemple, [z-\xff] est valable, mais [A-\d] et [A-[:digit:]] ne le sont pas.
Les plages fonctionnent dans l'ordre de classement des valeurs de caract�res. Elles peuvent �galement �tre utilis�es pour des caract�res sp�cifi�s num�riquement, par exemple [\000-\037]. Les plages peuvent inclure tous les caract�res qui sont valides pour le mode actuel.
Si une plage qui comprend des lettres est utilis�e lors d'un match insensible � la casse, il matche les lettres dans les deux cas. Par exemple, [W-c] est �quivalent � [][\\^_`wxyzabc], d�fini insensible � la casse, et dans un mode non-UTF, si les tables de caract�res pour une locale French sont en cours d'utilisation, [\xc8-\xcb] matche les caract�res accentu�s E dans les deux cas. Dans les modes UTF, PCRE soutient le concept de casse pour les caract�res avec des valeurs sup�rieures � 128 seulement quand il est compil� avec le support de propri�t� Unicode.
Les s�quences d'�chappement de caract�re \d, \D, \h, \H, \p, \P, \s, \S \v, \V, \w et \W peuvent appara�tre dans une classe de caract�res, et ajouter les caract�res qui matchent � la classe. Par exemple, [\dABCDEF] matche tous chiffres hexad�cimal. Dans les modes de UTF, l'option PCRE_UCP affecte les significations de \d, \s, \w et leurs partenaires majuscules, comme c'est le cas quand ils apparaissent en dehors d'une classe de caract�res, tel que d�crit dans la section intitul�e "Types de caract�res g�n�riques" ci-dessus. La s�quence d'�chappement \b a une signification diff�rente � l'int�rieur d'une classe de caract�res; elle matche le caract�re backspace. Les s�quences \B, \N, \R et \X ne sont pas sp�ciales � l'int�rieur d'une classe de caract�res. Comme toutes les autres s�quences d'�chappement non reconnus, elles sont trait�s comme des caract�res litt�raux "B", "N", "R", et "X" par d�faut, mais provoquent une erreur si l'option PCRE_EXTRA est install�e.
Un circonflexe peut �tre utilis� avec les types de caract�res majuscules pour sp�cifier un ensemble plus restreint de caract�res que le type minuscule. Par exemple, la classe [^\W_] matche une lettre ou un chiffre, mais pas le caract�re de soulignement, alors que [\w] inclut le soulignement. Une classe de caract�re positif doit �tre lu comme "quelque chose ou quelque chose ou ..." et une classe n�gative comme "pas quelque chose et pas quelque chose et pas ...".
Les seuls m�tacaract�res qui sont reconnus dans les classes de caract�res sont backslash, tiret (seulement o� il peut �tre interpr�t� comme sp�cifiant une plage), circonflexe (seulement au d�but), crochet ouvrant (seulement quand il peut �tre interpr�t� comme l'introduction d'un nom de classe POSIX, ou des raisons de compatibilit� sp�ciales - voir les deux sections suivantes), et le crochet fermant de terminaison. Cependant, en �chappant d'autres caract�res non alphanum�riques ne fait aucun mal.
Perl supporte la notation POSIX pour les classes de caract�res. Il utilise des noms entour�s par [: et :] � l'int�rieur de crochets englobant. PCRE soutient �galement cette notation. Par exemple,
[01[:alpha:]%]matche "0", "1", n'importe quel caract�re alphab�tique, ou "%", comme le montre l'exemple suivant:
_ArrayDisplay(StringRegExp("012aAB%���=", "[01[:alpha:]%]", 3))Les noms de classe support�s sont:
alnum lettres et chiffres alpha lettres ascii codes de caract�re 0 - 127 blank espace ou tabulation seulement cntrl caract�res de contr�le digit chiffres d�cimaux (comme \d) graph caract�res graphiques, sauf espace lower lettres minuscules print caract�res affichables, y compris espace punct caract�res affichables, non compris les lettres, les chiffres et l'espace space espaces blancs (comme \s � partir de PCRE 8.34) upper lettres majuscules word caract�res "word" (comme \w) xdigit chiffres hexad�cimauxPar d�faut les caract�res "space" sont HT (9), LF (10), VT (11), FF (12), CR (13), et espace (32). Si un match sp�cifique � la locale est install�, la liste des caract�res space peut �tre diff�rente; il peut y en avoir moins ou plus. "Space" est diff�rent de \s, car \s n'inclut pas VT, pour la compatibilit� Perl. Cependant, Perl a chang� � la version 5.18, et PCRE a suivi � la version 8.34. "Space" et \s matchent maintenant le m�me ensemble de caract�res.
Le nom "word" est une extension Perl, et "blank" est une extension GNU � partir de Perl 5.8. Une autre extension Perl est la n�gation, qui est indiqu�e par le caract�re ^ apr�s les deux points. Par exemple,
[12[:^digit:]]matche "1", "2", ou un caract�re qui n'est pas un chiffre, comme le montre l'exemple suivant:
_ArrayDisplay(StringRegExp("012aAB%���=:", "[12[:^digit:]]", 3))
Par d�faut, les caract�res avec des valeurs sup�rieures � 128 ne matchent � aucune classe de caract�re POSIX. Cependant, si l'option PCRE_UCP est activ�e, certaines classes sont modifi�es pour que les propri�t�s des caract�res Unicode soient utilis�es. Ceci est r�alis� en rempla�ant certaines classes POSIX par d'autres s�quences, comme il suit:
[:alnum:] devient \p{Xan} [:alpha:] devient \p{L} [:blank:] devient \h [:digit:] devient \p{Nd} [:lower:] devient \p{Ll} [:space:] devient \p{Xps} [:upper:] devient \p{Lu} [:word:] devient \p{Xwd}Exemple:
_ArrayDisplay(StringRegExp("�E��ab:1", "(*UCP)[12\p{Lu}]", 3))Les versions avec n�gations, comme [:^alpha:] utilise \P � la place de \p. Trois autres classes POSIX sont support�es sp�cialement en mode UCP:
[:graph:] Elle matche les caract�res qui ont des glyphes qui marquent la page lors de l'impression. En termes de propri�t� Unicode, elle matche tous les caract�res avec les propri�t�s L, M, N, P, S ou Cf, � l'exception de:
U+061C Arabic Letter Mark U+180E Mongolian Vowel Separator U+2066 - U+2069 Various "isolate"s
[:print:] Elle matche les m�mes caract�res que [:graph:] plus les caract�res Space qui ne sont pas des contr�les, c'est-�-dire, des caract�res avec la propri�t� Zs.
[:punct:] Elle matche tous les caract�res qui ont la propri�t� Unicode P (Ponctuation), plus les caract�res dont le code est inf�rieur � 128 qui ont la propri�t� S (Symbol).
Les autres classes POSIX sont inchang�es, et matchent seulement les caract�res avec un code inf�rieur � 128.
Dans la biblioth�que compatible POSIX.2 qui a �t� incluse dans 4.4BSD Unix, la syntaxe laide [[:<:]] et [[:>:]] est utilis�e pour un match au "d�but de mot" et "fin de mot". PCRE traite ces �l�ments comme il suit:
[[:<:]] est converti en \b(?=\w) [[:>:]] est converti en \b(?<=\w)Seules ces s�quences de caract�res exactes sont reconnues. Une s�quence telle que [a[:<:]b] provoque une erreur de nom de classe POSIX non reconnu. Ce support n'est pas compatible avec Perl. Elles sont fournies pour aider les migrations � partir d'autres environnements, et il vaut mieux ne pas les utiliser dans de nouveaux mod�les. Notez que \b matche au d�but et � la fin d'un mot (voir "Assertions simples" ci-dessus), et dans un mod�le de style Perl le caract�re pr�c�dent ou suivant montre normalement ce qui est recherch�, sans avoir besoin des assertions qui sont utilis�es ci-dessus afin de donner exactement le comportement POSIX.
Le caract�re Barre verticale est utilis� pour s�parer des mod�les alternatifs. Par exemple, le mod�le
gilbert|sullivanmatche soit "gilbert", soit "sullivan". N'importe quel nombre d'alternatives peut apparaitre, et une alternative vide est permise (elle matche la cha�ne vide). Le processus de match essaie chaque alternative � la suite, de gauche � droite, et la premi�re qui r�ussit est utilis�e. Si une alternative est � l'int�rieur d'un sous-mod�le (d�fini ci-dessous), "r�ussit" signifie qu'elle matche le reste du mod�le principal aussi bien que l'alternative dans le sous-mod�le.
Les param�tres d'options PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, et PCRE_EXTENDED (qui sont compatibles Perl) peuvent �tre activ�s � l'int�rieur du mod�le par une s�quence de lettres d'option Perl encadr�es entre "(?" and ")". Les lettres d'option sont:
i pour PCRE_CASELESS m pour PCRE_MULTILINE s pour PCRE_DOTALL x pour PCRE_EXTENDEDPar exemple, (?im) force un match insensible � la casse et multiligne. Il est aussi possible de d�sinstaller ces options en faisant pr�c�der la lettre d'un tiret, et une combinaison d'activation et de d�sactivation est aussi permise, comme (?im-sx), qui active PCRE_CASELESS et PCRE_MULTILINE mais d�sactive PCRE_DOTALL and PCRE_EXTENDED. Si une lettre apparait avant et apr�s le tiret, l'option est d�sactiv�e.
D'autres options sp�cifiques PCRE peuvent �tre modifi�es de la m�me fa�on que les options compatibles Perl:
J pour PCRE_DUPNAMES U pour PCRE_UNGREEDY X pour PCRE_EXTRA
Lorsque l'une de ces options de changement apparait au plus haut niveau (c�est-�-dire, pas � l�int�rieur des parenth�ses d�un sous-mod�le), le changement s'applique au reste du mod�le qui suit.
Un changement d'option � l'int�rieur d'un sous-mod�le (voir ci-dessous pour une description de sous-mod�le) affecte uniquement la partie du sous-mod�le qui la suit, ainsi:
(a(?i)b)cmatche abc et aBc et pas d'autre cha�ne (en supposant que PCRE_CASELESS n'est pas activ�e globalement). Par ce moyen, les options peuvent �tre d�finies pour forcer des comportements diff�rents dans les diff�rentes parties d'un mod�le. Les modifications apport�es dans une alternative portent dans les branches qui suivent dans le m�me sous-mod�le. Par exemple,
(a(?i)b|c)match "ab", "aB", "c" et "C", m�me si lors du match de "C", la premi�re branche est abandonn�e avant l�installation de l'option. En effet, les param�tres d'option sont pris en compte au moment de la compilation, autrement, il y aurait un comportement tr�s �trange.
_ArrayDisplay(StringRegExp("abaBcC", "(a(?i)b|c)", 3))
Remarque: Il existe d'autres options sp�cifiques � PCRE qui peuvent �tre activ�es par l'application lorsque les fonctions de compilation ou de match sont appel�s. Dans certains cas, le mod�le peut contenir des s�quences d�ent�te sp�ciales telle que (*CRLF) pour surcharger ce que l'application a �tabli ou ce qui a �t� fait par d�faut. Des d�tails sont donn�s dans la section intitul�e "S�quences Newline" ci-dessus. Il y a aussi les s�quences d�ent�te (*UTF8), (*UTF16),(*UTF32) et (*UCP) qui peuvent �tre utilis�es pour d�finir les modes UTF et Unicode; elles sont �quivalentes � la d�finition des options PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 et PCRE_UCP, respectivement. La s�quence (*UTF) est une version g�n�rique qui permet d'utiliser biblioth�ques.
Les sous-mod�les sont d�limit�s par des parenth�ses, qui peuvent �tre imbriqu�es. La transformation d�une partie d'un mod�le en un sous-mod�le sert � deux choses:
1. Localiser un ensemble d�alternatives. Par exemple, le mod�le:
cat(amaran|astrophe|)match "catamaran", "catastrophe", ou "cat". Sans les parenth�ses, il matcherait "catamaran", "astrophe" ou la cha�ne vide.
Les parenth�ses ouvrantes sont compt�es de gauche � droite (� partir de 1) pour affecter des num�ros aux sous-mod�les captur�s. Par exemple, le mod�le:
le ((roi |valet )(noir|rouge))matche la cha�ne "le roi rouge ou noir" et les sous-cha�nes captur�es sont "roi rouge", "roi", et "rouge", et sont num�rot�es 1, 2, et 3, respectivement. La preuve:
_ArrayDisplay(StringRegExp("le roi rouge ou noir", "le ((roi |valet )(noir|rouge))", 3))
Le fait que de simples parenth�ses remplissent deux fonctions n�est pas toujours utile. Il y a souvent des cas o� un regroupement en sous-mod�le est n�cessaire, sans qu�il soit besoin d�effectuer des captures. Si une parenth�se ouvrante est suivie d'un point d'interrogation et du caract�re �:� , le sous-mod�le ne fait pas de capture, et n�est pas compt� dans le calcul des num�ros des s�quences de capture. Par exemple, le mod�le:
le ((roi |valet )(?:noir|rouge))matche la cha�ne "le roi rouge ou noir" et les sous-cha�nes captur�es sont "roi rouge" et "roi ", et sont num�rot�es 1 et 2. La preuve:
_ArrayDisplay(StringRegExp("le roi rouge ou noir", "le ((roi |valet )(?:noir|rouge))", 3))Le nombre maximum de sous-mod�les de capture est 65535.
En guise de raccourci pratique, si des param�tres d'option sont n�cessaires au d�but d'un sous-mod�le non capturant, les lettres d'option peuvent appara�tre entre le "?" et le ":". Ainsi, les deux mod�les (dans lesquels il convient d�ignorer les espaces qui ne sont pr�sents que pour la lisibilit�):
(?i: samedi | dimanche) (?: (?i) samedi | dimanche)matchent exactement le m�me ensemble de cha�ne. Parce que les branches alternatives sont essay�es de gauche � droite, et que les options ne sont pas r�initialis�es jusqu'� ce que la fin du sous-mod�le soit atteinte, un param�tre d'option dans une branche affecte les branches suivantes, de sorte que les mod�les ci-dessus matchent "DIMANCHE", aussi bien que "Samedi". La preuve:
_ArrayDisplay(StringRegExp("saMEdi, DIMANCHE, lundi", "(?i:samedi|dimanche)", 3))
Perl 5.10 introduit un concept dans lequel chaque alternative d�un sous-mod�le utilise les m�mes num�ros pour ses parenth�ses capturantes. Un tel sous-mod�le commence par (?| et est lui-m�me un sous-mod�le non capturant. Par exemple, consid�rez ce mod�le:
(?|(Mer)cre|(Jeu))diParce que les deux alternatives sont � l'int�rieur d'un groupe (?| , les deux ensembles de parenth�ses capturantes sont num�rot�s 1. Ainsi, lorsque le mod�le matche, vous pouvez consulter la sous-cha�ne captur�e num�ro 1, quelle que soit l�alternative qui a match�. Cette construction est utile lorsque vous voulez capturer une partie, mais pas tout, d'une des alternatives. A l'int�rieur d'un groupe (?| , les parenth�ses sont num�rot�es comme d'habitude, mais le nombre est remis � z�ro au d�but de chaque branche. Les num�ros des parenth�ses capturantes qui suivent le sous-mod�le d�marre apr�s le plus grand num�ro utilis� dans une branche. L'exemple suivant est extrait de la documentation Perl. Les num�ros en dessous montrent dans quelle m�moire tampon le contenu captur� sera stock�.
# before ---------------branch-reset----------- after ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) # 1 2 2 3 2 3 4 Preuve: msgbox(0,"",StringRegExpReplace("apqrz", "(a)(?|x(y)z|(p(q)r)|(t)u(v))(z)", "1:\1 2:\2 3:\3 4:\4"))Une r�f�rence arri�re � un sous-mod�le num�rot� utilise la valeur la plus r�cente qui est d�finie pour ce num�ro par n�importe quel sous-mod�le. Le mod�le suivant matche "abcabc" ou "defdef":
$regex = "(?|(abc)|(def))\1" $array = StringRegExp("abcabcdefdef", $regex, 4) _ArrayDisplay($array[0]) _ArrayDisplay($array[1])Les deux tableaux affich�s dans l'exemple ci-dessus donne tous les deux le match complet en [0] et le groupe captur� en [1].
$regex = "(?|(abc)|(def))(?1)" $array = StringRegExp("abcabcdefabc", $regex, 4) _ArrayDisplay($array[0]) _ArrayDisplay($array[1])Si le test d'une condition pour un sous-mod�le ayant match� fait r�f�rence � un num�ro qui n'est pas unique, le test est True si n'importe quel mod�le qui a ce num�ro a match�.
Une approche alternative pour l'utilisation de la fonctionnalit� "r�initialisation sur les branches" consiste � utiliser des sous-mod�les nomm�s dupliqu�s, comme d�crit dans la section suivante.
L�identification des parenth�ses capturantes par un num�ro est simple, mais elle peut �tre tr�s difficile de garder la trace des num�ros dans les expressions r�guli�res complexes. En outre, si une expression est modifi�e, les num�ros peuvent changer. Pour aider � cette difficult�, PCRE propose de nommer les sous-mod�les. Ce concept a �t� ajout� � Perl � la version 5.10. Python a int�gr� cette fonctionnalit� plus t�t, et PCRE la introduite � la version 4.0, en utilisant la syntaxe Python. PCRE prend d�sormais en charge la syntaxe Perl et Python. Perl permet � des sous-mod�les de m�me num�ro d'avoir des noms diff�rents, mais pas PCRE.
En PCRE, un sous-mod�le peut �tre nomm� de l'une des trois fa�ons suivantes: (?<name>...) ou (?'name'...) comme en Perl, ou (?P<name>...) comme en Python. Les r�f�rences aux parenth�ses capturantes � partir d'autres parties du mod�le, dans les r�f�rences arri�res, dans la r�cursivit� et dans les conditions, peuvent �tre faites par nom, aussi bien que par num�ro.
Les noms peuvent comporter jusqu'� 32 caract�res alphanum�riques ainsi que le caract�re de soulignement mais doivent commencer par un caract�re qui n'est pas un chiffre. Les parenth�ses capturantes nomm�s sont toujours affect�s de num�ro ainsi que de nom, exactement comme si les noms n��taient pas pr�sents. L'API PCRE fournit des appels de fonction pour extraire la table de traduction nom vers num�ro � partir d'un mod�le compil�. Il y a aussi une fonction pratique pour l'extraction d'une sous-cha�ne captur�e par son nom.
La fonctionnalit� suivante ne peut pas �tre activ�e dans AutoIt.
Par d�faut, un nom doit �tre unique dans un mod�le, mais il est possible de s�affranchir de cette contrainte en d�finissant l'option PCRE_DUPNAMES (?J) en d�but de mod�le. (Les doublons sont �galement toujours autoris�s pour des sous-mod�les avec le m�me num�ro, comme d�crit dans la section pr�c�dente). Dupliquer les noms peut �tre utile pour des mod�les o� une seule instance de parenth�ses nomm�es peut matcher. Supposons que vous vouliez matcher le nom d'un jour de la semaine, soit comme une abr�viation � 3 lettres soit comme un nom complet, et dans les deux cas que vous vouliez extraire l'abr�viation. Ce mod�le (en ignorant les sauts de ligne) fait le travail:
$regex = '(?Jix)' & _ '(?<Jour>Lun|Mar|Jeu)(?:di)? | ' & _ '(?<Jour>Mer)(?:credi)? | ' & _ '(?<Jour>Ven)(?:dredi)? | ' & _ '(?<Jour>Sam)(?:edi)? | ' & _ '(?<Jour>Dim)(?:anche)?' $sujet = 'Lun Mardi Mercredi jeudi Ven Sam dimanche' $arr = StringRegExp($sujet, $regex, 4) For $i=0 to 6 _ArrayDisplay($arr[$i]) NextIl y a cinq sous-mod�les capturants, mais un seul groupe est toujours mis apr�s un match. (Une autre fa�on de r�soudre ce probl�me est d'utiliser un sous-mod�le "r�initialisation dans les branches", comme d�crit dans la section pr�c�dente.)
La fonction pratique pour l'extraction de donn�es par nom retourne la sous-cha�ne du premier (et, dans cet exemple, le seul) sous-mod�le de ce nom qui matche. Cela permet d'�conomiser la recherche pour trouver lequel du sous-mod�le il �tait.
Si vous faites une r�f�rence arri�re � un sous-mod�le nomm� non unique � partir d�un autre endroit du mod�le, les sous-mod�les auquel le nom se r�f�re sont examin�s dans l'ordre dans lequel ils apparaissent dans le mod�le global. Le premier qui est d�fini est utilis� pour la r�f�rence. Par exemple, ce mod�le matche � la fois "aa" et "bb" mais pas "ab" ou "ba":
$regex = "(?<n>(a|b))\g{n}" msgbox(0,"",StringRegExp("aa", $regex, 0)) msgbox(0,"",StringRegExp("bb", $regex, 0)) msgbox(0,"",StringRegExp("ab", $regex, 0)) msgbox(0,"",StringRegExp("ba", $regex, 0))
Si vous effectuez un appel de sous-programme � un sous-mod�le dont le nom n'est pas unique, celui qui correspond � la premi�re occurrence du nom est utilis�. En l'absence de num�ro doublon (voir la section pr�c�dente) c'est celui avec le plus petit num�ro.
Si vous utilisez une r�f�rence nomm�e dans un test de condition (voir la section sur les conditions ci-dessous), soit pour v�rifier si un sous-mod�le a match�, soit pour v�rifier une r�cursivit�, tous les sous-mod�les du m�me nom sont test�s. Si la condition est vraie pour l'un d'entre eux, la condition g�n�rale est vraie. C'est le m�me comportement que les tests avec les num�ros. Pour plus de d�tails sur les interfaces pour traiter les sous-mod�les nomm�s, voir la documentation pcreapi.
Attention: Vous ne pouvez pas utiliser des noms diff�rents pour distinguer entre deux sous-mod�les avec le m�me num�ro, car PCRE utilise uniquement les num�ros lors des matchs. Pour cette raison, une erreur est donn�e au moment de la compilation si des noms diff�rents sont donn�s � des sous-mod�les qui ont le m�me num�ro. Cependant, vous pouvez donner le m�me nom � des sous-mod�les qui ont le m�me num�ro, m�me lorsque PCRE_DUPNAMES n�est pas d�finie.
Les r�p�titions sont sp�cifi�es par des quantificateurs, qui peuvent suivre l'un des �l�ments suivants:
un caract�re litt�ral le m�tacaract�re point la s�quence d'�chappement \C la s�quence d'�chappement \X la s�quence d'�chappement \R un �chappement comme \d ou \pL qui matche un seul caract�re une classe de caract�res une r�f�rence arri�re (voir la section suivante) un sous-mod�le parenth�s� (y compris les assertions) un appel � un sous-programme d�un sous-mod�le (r�cursif ou autre)Le quantificateur de r�p�tition g�n�ral sp�cifie un nombre minimum et maximum de matchs autoris�s, en donnant les deux nombres entre accolades, s�par�s par une virgule. Les nombres doivent �tre inf�rieurs � 65536, et le premier doit �tre inf�rieur ou �gal au second. Par exemple:
z{2,4}matche "zz", "zzz", ou "zzzz". Une accolade fermante sur elle-m�me n�est pas un caract�re sp�cial. Si le second nombre est omis, mais que la virgule est pr�sente, il n'y a pas de limite sup�rieure; si le second nombre et la virgule sont tous les deux omis, le quantificateur sp�cifie un nombre exact de matchs requis. Ainsi:
[aeiou]{3,}matche au moins 3 voyelles successives, mais peut en matcher beaucoup plus, tandis que:
\d{8}matche exactement 8 chiffres. Une accolade ouvrante qui appara�t dans une position o� un quantificateur n�est pas autoris�, ou qui ne respecte pas la syntaxe des quantificateurs, est consid�r�e comme un caract�re litt�ral. Par exemple, {,6} n�est pas un quantificateur, mais une cha�ne de quatre caract�res.
Dans les modes UTF, les quantificateurs s�appliquent aux caract�res plut�t qu�aux unit�s de donn�es individuelles. Ainsi, par exemple, \x{100}{2} matche deux caract�res, dont chacun est repr�sent� par une s�quence de deux octets dans une cha�ne de caract�res UTF-8. De m�me, \X{3} matche trois granules de graph�mes �tendus Unicode, chacune d'elle pouvant �tre des unit�s de donn�es de plusieurs longueur (et elles peuvent �tre de longueurs diff�rentes).
Le quantificateur {0} est autoris�, mais l'expression se comporte comme si l'�l�ment pr�c�dent et le quantificateur n��taient pas pr�sents. Cela peut �tre utile pour des sous-mod�les qui sont r�f�renc�s comme des sous-programmes provenant d'ailleurs dans le mod�le (mais voir aussi la section intitul�e "D�finition des sous-mod�les pour une utilisation par r�f�rence" ci-dessous). Les �l�ments autres que des sous-mod�les qui ont un quantificateur {0} sont omis du mod�le compil�.
Pour plus de commodit�, les trois quantificateurs les plus courants ont des abr�viations � caract�re unique:
* est �quivalent � {0,} + est �quivalent � {1,} ? est �quivalent � {0,1}Il est possible de construire des boucles infinies en faisant suivre un sous-mod�le qui ne matche aucun caract�re par un quantificateur sans limite sup�rieure, par exemple:
(a?)*Les versions ant�rieures de Perl et PCRE levaient une erreur au moment de la compilation pour ces mod�les. Cependant, parce qu'il y a des cas o� cela peut �tre utile, ces mod�les sont maintenant accept�es, mais si la r�p�tition du sous-mod�le ne matche aucun caract�re, la boucle est arr�t�e de force.
Par d�faut, les quantificateurs sont "gourmands", ce qui veut dire qu�ils matchent autant que possible (jusqu'au nombre maximal de fois autoris�s), sans provoquer un �chec du reste du mod�le. L'exemple classique o� cela pose des probl�mes est en essayant de matcher les commentaires de programmes C. Ils apparaissent entre /* et */ et dans un commentaire, les caract�res * et / individuel peuvent appara�tre. Une tentative pour matcher les commentaires C en appliquant le mod�le:
/\*.*\*/� la cha�ne :
/* Premier commentaire */ pas de commentaire /* second commentaire */�choue, car il matche la cha�ne enti�re en raison de la gourmandise du quantificateur .*
Toutefois, si un quantificateur est suivi d'un point d'interrogation, il cesse d'�tre gourmand, et � la place matche un nombre minimum de fois possibles, de sorte que le mod�le :
$regex = "/\*.*?\*/" _ArrayDisplay(StringRegExp("/*rem1*/x=1/*rem2*/", $regex, 4)[0]) _ArrayDisplay(StringRegExp("/*rem1*/x=1/*rem2*/", $regex, 4)[1])fait ce qu�on attend avec les commentaires C. La signification des diff�rents quantificateurs n'est pas modifi�e, juste le nombre de matchs. Ne confondez pas cette utilisation du point d'interrogation avec son utilisation comme quantificateur qui a sa signification propre. Parce qu'il a deux utilisations, qui peuvent parfois sembler en double, comme dans :
$regex = "a\d??\db" ; ?? = 0 ou 1 frugal _ArrayDisplay(StringRegExp("a1b", $regex, 4)[0]) _ArrayDisplay(StringRegExp("a23b", $regex, 4)[0])qui matche un chiffre de pr�f�rence, mais peut en matcher deux si c'est la seule fa�on pour que le reste du mod�le matche.
Si l'option PCRE_UNGREEDY (?U) est activ�e (une option qui n�est pas disponible en Perl), les quantificateurs ne sont pas gourmands par d�faut, mais un quantificateur particulier peut �tre gourmand en le faisant suivre d�un point d'interrogation. En d'autres termes, l�option inverse le comportement par d�faut.
Quand un sous-mod�le parenth�s� est quantifi� avec un nombre minimal de r�p�titions qui est sup�rieur � 1 ou avec une limite maximale, davantage de m�moire est n�cessaire pour le mod�le compil�, proportionnellement � la taille de la valeur minimale ou maximale.
Si un mod�le commence par .* ou .{0,} et si l'option PCRE_DOTALL (?s) (�quivalent au /s de Perl) est activ�e, permettant ainsi au point de matcher les newlignes, le mod�le est implicitement ancr�, parce que tout ce qui suit sera test� � chaque position de caract�re de la cha�ne sujet, aussi il n'y a pas de point dans la nouvelle tentative de match global avec n�importe quelle position apr�s la premi�re. PCRE traite normalement un tel mod�le comme si il �tait pr�c�d� par \A.
Dans les cas o� l'on sait que la cha�ne sujet ne contient pas de newligne, il est �quivalent d�activer PCRE_DOTALL afin d'obtenir cette optimisation, ou encore d�utiliser ^ pour indiquer l�ancrage explicitement.
Cependant, il existe quelques cas dans lesquels l'optimisation ne peut pas �tre utilis�e. Lorsque .* est � l'int�rieur de parenth�ses de capture qui font l'objet d'une r�f�rence arri�re ailleurs dans le mod�le, un match au d�but peut �chouer, alors qu�un match ult�rieure peut r�ussir. Consid�rons, par exemple:
$regex = "(.*)abc\1" _ArrayDisplay(StringRegExp("xyz123abc123", $regex, 4)[0])Si le sujet est "xyz123abc123" le point du match est le quatri�me caract�re. Pour cette raison, un tel mod�le n�est pas implicitement ancr�.
Un autre cas o� l'ancrage implicite n'est pas appliqu� est celui o� le pr�fixe .* est � l'int�rieur d'un groupe atomique. Encore une fois, un match au d�but peut �chouer alors qu'un match plus loin peut r�ussir. Consid�rez ce mod�le:
$regex = "(?>.*?a)b" _ArrayDisplay(StringRegExp("aab", $regex, 4)[0])Il matche "ab" dans le sujet "aab". L'utilisation des verbes de contr�le de backtracking (*PRUNE) et (*SKIP) d�sactive aussi cette optimisation.
Quand un sous-mod�le capturant est r�p�t�, la valeur captur�e est la sous-cha�ne qui est match�e � la derni�re it�ration. Par exemple, apr�s que:
$regex = "(tweedle[dume]{3}\s*)+" _ArrayDisplay(StringRegExp("tweedledum tweedledee", $regex, 4)[0])ait match� "tweedledum tweedledee", la valeur de la sous-cha�ne captur�e est "tweedledee". Toutefois, s�il y a des mod�les capturants imbriqu�s, les valeurs captur�es correspondantes peuvent avoir �t� d�finies lors de pr�c�dentes it�rations. Par exemple, apr�s que:
$regex = "(a|(b))+" _ArrayDisplay(StringRegExp("aba", $regex, 4)[0])ait match� "aba", la valeur de la deuxi�me cha�ne captur�e est "b".
En maximisant ("gourmand") et en minimisant ("frugal"), en m�me temps, les r�p�titions, l'�chec de ce qui suit entraine normalement que l'�l�ment r�p�t� sera r��valu� pour voir si un nombre diff�rent de r�p�titions permet au reste du mod�le de matcher. Parfois, il est utile d'emp�cher cela, soit en changeant la nature du match, soit en provoquant son �chec plus t�t qu'il ne le ferait autrement, lorsque l'auteur du mod�le sait qu'il ne sert � rien de continuer.
Consid�rons, par exemple, le mod�le ci-dessous lorsqu'il est appliqu� � la ligne "123456bar":
\d+fooApr�s avoir match� les 6 chiffres et �chou� sur "foo", l'action normale du moteur est d'essayer � nouveau avec seulement 5 chiffres avec l��l�ment \d+, puis avec 4, et ainsi de suite, jusqu'� l'�chec final. "Le groupement atomique" (une expression tir�e du livre de Jeffrey Friedl) fournit les moyens de pr�ciser qu'une fois qu'un sous-mod�le a match�, il ne doit pas �tre r��valu� de cette mani�re.
Si nous utilisons le groupement atomique dans l'exemple pr�c�dent, le moteur renonce imm�diatement � matcher "foo" � la suite du premier �chec. La notation est une sorte de parenth�se sp�ciale, qui commence par (?> comme dans cet exemple:
(?>\d+)fooCe genre de parenth�ses "verrouillent" la partie du mod�le qu'elles encadrent une fois que le mod�le a match�, et un �chec plus loin dans le mod�le interdira le backtracking entre ces parenth�ses. Le backtracking sur des �l�ments pr�c�dents fonctionne, cependant, normalement.
Une autre description est qu�un sous-mod�le de ce type matche la cha�ne de caract�res qu'un mod�le autonome identique devrait match�, s�il �tait ancr� au point courant dans la cha�ne sujet.
Le groupement atomique des sous-mod�les ne font pas des sous-mod�les capturants. Des cas simples tels que l'exemple ci-dessus peut �tre consid�r� comme une r�p�tition qui maximise et qui doit avaler tout ce qu'elle peut. Donc, alors que les deux \d+ et \d+? sont pr�ts � ajuster le nombre de chiffres qu'ils matchent afin de faire matcher le reste du mod�le, (?>\d+) ne peut matcher qu'une s�quence enti�re de chiffres.
Les groupes atomiques, en g�n�ral, peuvent bien entendu contenir des sous-mod�les arbitrairement complexes, et peuvent �tre imbriqu�es. Cependant, lorsque le sous-mod�le d'un groupe atomique est juste un �l�ment isol� r�p�t�, comme dans l'exemple ci-dessus, une notation simple, appel�e "quantificateur possessif" peut �tre utilis�. Elle consiste en un caract�re suppl�mentaire + � la suite d�un quantificateur. En utilisant cette notation, l'exemple pr�c�dent peut �tre r��crit comme:
\d++fooNotez qu'un quantificateur possessif peut �tre utilis� avec un groupe entier, par exemple:
(abc|xyz){2,3}+Les quantificateurs possessifs sont toujours gourmands; l'option PCRE_UNGREEDY est ignor�e. Ils sont une notation pratique pour les formes plus simples de groupe atomique. Cependant, il n'y a pas de diff�rence de signification entre un quantificateur possessif et le groupe atomique �quivalent, bien qu'il puisse y avoir une diff�rence de performance; les quantificateurs possessifs devraient �tre l�g�rement plus rapide.
La syntaxe de quantificateur possessif est une extension de la syntaxe 5.8 Perl. Jeffrey Friedl origine de l'id�e (et du nom) dans la premi�re �dition de son livre. Mike McCloskey l�a aim�, donc impl�ment� quand il a construit Java, le paquage de Sun, et PCRE l�a copi� � partir de l�. Elle a finalement �t� int�gr�e dans Perl � la version 5.10.
PCRE a une optimisation qui rend possessif automatiquement certaines constructions simples de mod�le. Par exemple, la s�quence A+B est trait�e comme A++B parce qu'il n'y a pas de point de backtracking dans une s�quence de A quand B doit suivre.
Quand un mod�le contient une r�p�tition illimit�e � l'int�rieur d'un sous-mod�le, qui peut lui-m�me �tre r�p�t�e un nombre illimit� de fois, l'utilisation d'un groupe atomique est la seule fa�on d'�viter que des matchs en cours d��chec prennent un temps tr�s long. Le mod�le:
$regex = "(\D+|?<\d+?>)*[!?]" _ArrayDisplay(StringRegExp("abc!?", $regex, 4)[0]) _ArrayDisplay(StringRegExp("?<123?>!?", $regex, 4)[0]) _ArrayDisplay(StringRegExp("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!?", $regex, 4)[0])matche un nombre illimit� de sous-cha�nes qui sont, soit constitu�es de non-chiffres, soit de chiffres entre <>, suivie de ! ou ?. Quand il matche, il s'ex�cute rapidement. Par contre, s'il est appliqu� � "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" le traitement prend beaucoup de temps avant de signaler l'�chec. Ceci car la cha�ne peut �tre divis�e entre la r�p�tition interne \D+ et la r�p�tition externe * d�un grand nombre de fa�ons, et toutes doivent �tre test�es. (L'exemple utilise [!?] plut�t qu'un seul caract�re � la fin, parce que PCRE et Perl ont une optimisation qui permet un �chec rapide quand un seul caract�re est utilis�. Ils se souviennent du dernier caract�re qui est n�cessaire pour matcher, et �choue rapidement s�il ne figure pas dans la cha�ne). Si le mod�le est modifi� de sorte qu'il utilise un groupe atomique, comme ceci:
((?>\D+)|?<\d+?>)*[!?]il matche des s�quences de non-chiffres qui ne peuvent pas �tre rompues, et l'�chec se produit rapidement.
En dehors d'une classe de caract�re, un antislash suivi d'un chiffre strictement sup�rieur � 0 (et �ventuellement d'autres chiffres) est une r�f�rence arri�re � un sous-mod�le capturant qui pr�c�de, � condition qu'il y ait eu suffisamment de parenth�ses gauches capturantes.
Exemple: d�terminer si un nombre est premier.
Le mod�le suivant (en ignorant les espaces):
^(..+?) \1+ $matche une cha�ne de longueur > 1 qui peut se d�composer en sous-cha�nes de m�me taille > 1, en d'autres termes dont la longueur n'est PAS un nombre premier.
Not StringRegExp(_StringRepeat('-', $n), '^.$|^(..+?)\1+$')
Si le nombre qui suit le backslash est strictement inf�rieur � 10, il est toujours consid�r� comme une r�f�rence arri�re, et provoque une erreur seulement s'il n'y a pas le nombre de parenth�ses gauches capturantes dans le mod�le entier. En d'autres termes, les parenth�ses qui sont r�f�renc�s ne sont pas n�cessairement � la gauche de la r�f�rence pour les nombres inf�rieurs � 10. Une "r�f�rence arri�re post�rieure" de ce type peut prendre un sens quand une r�p�tition est concern�e et que le sous-mod�le � la droite a particip� � une it�ration ant�rieure.
Il est impossible d'avoir une "r�f�rence arri�re post�rieure" num�rique � un sous-mod�le dont le nombre est 10 ou davantage, en utilisant cette syntaxe, car une s�quence telle que \50 est interpr�t� comme un caract�re d�fini en octal. Voir la sous-section intitul�e "Caract�res non-imprimables" ci-dessus pour plus de d�tails sur l�utilisation de chiffres derri�re un backslash. Il n'y a pas de probl�me quand des parenth�ses nomm�es sont utilis�es. Une r�f�rence arri�re � un sous-mod�le est possible en utilisant des parenth�ses nomm�es (voir ci-dessous).
Une autre fa�on d'�viter l'ambigu�t� inh�rente � l'utilisation de chiffres suivant un backslash consiste � utiliser la s�quence d'�chappement \g. Cet �chappement doit �tre suivi par un nombre non sign� ou un nombre n�gatif, facultativement entre accolades. Ces exemples sont tous identiques:
(ring), \1 (ring), \g1 (ring), \g{1}Un nombre non sign� sp�cifie une r�f�rence absolue sans l'ambigu�t� qui est pr�sente dans la syntaxe plus ancienne. Il est �galement utile lorsque les chiffres litt�raux suivent la r�f�rence. Un nombre n�gatif est une r�f�rence relative. Consid�rez cet exemple:
$regex = "(abc(def)ghi)\g{-1}" _ArrayDisplay(StringRegExp("abcdefghidef", $regex, 4)[0]) Msgbox(0,"",StringRegExp("abcdefghiabc", $regex, 0))La s�quence \g{-1} est une r�f�rence au d�but du sous-mod�le capturant le plus r�cent avant \g, ce qui est �quivalent � \2 dans cet exemple. De m�me, \g{-2} serait �quivalent � \1. L'utilisation de r�f�rences relatives peut �tre utile dans de longs mod�les, et aussi dans des mod�les qui sont cr��s par assemblage de fragments qui contiennent des r�f�rences entre eux.
Une r�f�rence arri�re matche quel que soit le sous-mod�le capturant qui matche actuellement dans la cha�ne sujet, plut�t que quelque chose en train de matcher le sous-mod�le lui-m�me (voir ci-dessous "Sous-mod�les en tant que sous-programmes" pour une fa�on de faire �a). Donc, le mod�le:
$regex = "(perplex|complex)e et \1it�" Msgbox(0,"",StringRegExp("perplexe et perplexit�", $regex, 0)) Msgbox(0,"",StringRegExp("complexe et complexit�", $regex, 0)) Msgbox(0,"",StringRegExp("perplexe et complexit�", $regex, 0))matche "perplexe et perplexit�" et "complexe et complexit�", mais pas "perplexe et complexit�". Si l�insensibilit� � la casse est activ�e au moment de la r�f�rence arri�re, la casse des lettres reste pertinente. Par exemple:
$regex = "((?i)abc)\s+\1" Msgbox(0,"",StringRegExp("abc abc", $regex, 0)) Msgbox(0,"",StringRegExp("ABC ABC", $regex, 0)) Msgbox(0,"",StringRegExp("abc ABC", $regex, 0))matche "abc abc" et "ABC ABC", mais pas "ABC abc", m�me si le sous-mod�le capturant initial matche de fa�on insensible � la casse.
Il existe plusieurs fa�ons diff�rentes d��crire les r�f�rences arri�re � un sous-mod�les nomm�s. La syntaxe .NET, \k{name} et la syntaxe Perl \k
(?<p1>(?i)abc)\s+\k<p1>
(?'p1'(?i)abc)\s+\k{p1}
(?P<p1>(?i)abc)\s+(?P=p1)
(?<p1>(?i)abc)\s+\g{p1}
Un sous-mod�le qui est r�f�renc� par un nom peut appara�tre dans le mod�le avant ou apr�s la r�f�rence.
Il peut y avoir plus d'une r�f�rence arri�re au m�me sous-mod�le. Si un sous-mod�le n'a pas �t� effectivement utilis� dans un match particulier, toutes les r�f�rences arri�re le concernant �choueront toujours, par d�faut. Par exemple, le mod�le:
(a|(bc))\2�choue toujours s�il commence par matcher "a" plut�t que "bc". Cependant, si l'option PCRE_JAVASCRIPT_COMPAT est install�e au moment de la compilation, une r�f�rence arri�re vers une valeur non d�finie matche une cha�ne vide. Comme il peut y avoir beaucoup de parenth�ses capturantes dans un mod�le, tous les chiffres suivants un backslash sont consid�r�s comme un num�ro potentiel de r�f�rence arri�re. Si le mod�le se poursuit avec un caract�re chiffre, un d�limiteur doit �tre utilis� pour terminer la r�f�rence arri�re. Si l'option PCRE_EXTENDED est install�e, le d�limiteur peut �tre un espace blanc. Sinon, la syntaxe \g{ ou un commentaire vide (voir �Commentaires� ci-dessous) peuvent �tre utilis�s.
Une r�f�rence arri�re qui se produit � l'int�rieur des parenth�ses auxquelles elle se r�f�re �choue lorsque le sous-mod�le est utilis� en premier, donc, par exemple, (a\1) ne matche jamais. Toutefois, ces r�f�rences peuvent �tre utiles � l'int�rieur des sous-mod�les r�p�t�es. Par exemple, le mod�le:
$regex = "(a|b\1)+" _ArrayDisplay(StringRegExp("aba", $regex, 4)[0])matche n�importe quel nombre de "a" et aussi "aba", "ababbaa" etc. A chaque it�ration du sous-mod�le, la r�f�rence arri�re matche le caract�re de la cha�ne correspondant � l'it�ration pr�c�dente. Pour que cela fonctionne, le mod�le doit �tre tel que la premi�re it�ration n'ait pas besoin de matcher la r�f�rence arri�re. Ceci peut �tre effectu� en utilisant l'alternative, comme dans l'exemple ci-dessus, ou par un quantificateur avec un minimum de z�ro.
Les r�f�rences arri�res de ce type traitent le groupe auquel elles font r�f�rence comme un groupe atomique. Une fois que l'ensemble du groupe a �t� match�, un �chec de match ult�rieur ne peut pas provoquer de retour en arri�re au milieu du groupe.
Une assertion est un test sur les caract�res qui suivent ou qui pr�c�dent le point de match courant qui ne consomme pas de caract�re. Les assertions simples cod�es \b, \B, \A, \G, \Z, \z, ^ et $ sont d�crites ci-dessus.
Les assertions plus complexes sont cod�es comme des sous-mod�les. Il en existe de deux types: celles qui regardent vers l�avant de la position actuelle dans la cha�ne sujet, et celles qui regardent vers l�arri�re. Un sous-mod�le assertion est match� de fa�on normale, sauf que la position actuelle du match n�est pas modifi�e.
Les sous-mod�les assertions ne sont pas des sous-mod�les capturants. Si une telle assertion contient des sous-mod�les capturants en son sein, ils sont compt�s pour les besoins de la num�rotation des sous-mod�les capturants dans le mod�le entier. Cependant, la capture d�une sous-cha�ne est effectu�e uniquement pour les assertions positives (Perl quelquefois, mais pas toujours, fait des captures d'assertions n�gatives.)
Pour la compatibilit� avec Perl, les sous-mod�les assertions peuvent �tre r�p�t�s; mais cela n'a aucun sens d'affirmer la m�me chose � plusieurs reprises, l'effet de bord des parenth�ses capturantes peut parfois �tre utile. Dans la pratique, il n'y a que trois cas:
(1) Si le quantificateur est {0}, l'assertion n�est jamais satisfaite lors d�un match. Cependant, elle peut contenir des groupes de parenth�ses capturantes internes qui sont appel�es d�ailleurs via le m�canisme de sous-routine.
(2) Si le quantificateur est {0, n}, o� n est sup�rieur � z�ro, l�assertion est trait�e comme si elle �tait {0,1}. Au moment de l'ex�cution, le reste du mod�le est essay� avec et sans l'assertion, l'ordre d�pendant de la gourmandise du quantificateur.
(3) Si la r�p�tition minimale est sup�rieure � z�ro, le quantificateur est ignor�e. L'assertion est satisfaite juste une fois lorsqu�un match est rencontr�.
Une assertion lookahead POSITIVE est un sous-mod�le qui �nonce une condition qui DOIT �tre satisfaite par le match en cours mais qui concerne les caract�res qui suivent le point courant de match. Alors qu'une lookahead NEGATIVE �nonce une condition qui NE DOIT PAS �tre satisfaite par le match.
Les assertions lookahead commencent par (?= pour les assertions positives et par (?! pour les assertions n�gatives. Par exemple:
\w+(?=;)matche un mot suivi d'un point-virgule, mais n'inclut pas le point-virgule dans le match , et:
foo(?!bar)matche les occurrences de "foo" qui ne sont pas suivis par "bar". Notez que le motif apparemment similaire:
(?!foo)barne trouve pas une occurrence de "bar" qui est pr�c�d�e par autre chose que "foo"; il trouve les occurrences de "bar", parce que l'assertion (?!foo) est toujours vraie lorsque les trois caract�res qui suivent sont "bar". Une assertion lookbehind est n�cessaire pour obtenir le premier effet.
Si vous voulez forcer un �chec du match � un certain point dans un mod�le, la fa�on la plus pratique de le faire est avec (?!), car une cha�ne vide matche toujours, donc une assertion qui exige qu'il n'y ait pas de cha�ne vide �choue toujours. Le verbe de contr�le backtracking (*FAIL) ou (*F) est un synonyme pour (?!).
Une assertion lookbehind POSITIVE est un sous-mod�le qui �nonce une condition qui DOIT �tre satisfaite par le match en cours mais qui concerne les caract�res qui pr�c�dent le point courant de match. Alors qu'une lookbehind NEGATIVE �nonce une condition qui NE DOIT PAS �tre satisfaite par le match.
Les assertions Lookbehind commence par (?<= pour les assertions positives et (?<! pour les assertions n�gatives. Par exemple:
(?<!foo)bartrouve une occurrence de "bar" qui n'est pas pr�c�d�e de "foo". Le contenu d'une assertion lookbehind est restreinte de sorte que toutes les cha�nes qu'elle matche doivent avoir une longueur fixe. Cependant, s'il existe plusieurs alternatives de premier niveau, elles ne doivent pas toutes avoir la m�me longueur fixe. Ainsi:
�� (?<=bullock|donkey)est autoris�, mais
�� (?<!dogs?|cats?)provoque une erreur. Les branches correspondant � des cha�nes de longueur diff�rente sont autoris�s uniquement au niveau sup�rieur d'une assertion lookbehind. C'est une extension par rapport � Perl, qui exige que toutes les branches matchent la m�me longueur de la cha�ne. Une assertion telle que:
(?<=ab(c|de))n'est pas autoris�e, car sa seule branche de premier niveau peut matcher deux longueurs diff�rentes, mais elle est acceptable pour PCRE si elle est r��crite pour utiliser deux branches de niveau haut
(?<=abc|abde)Dans certains cas, la s�quence d'�chappement \K (voir pr�c�demment) peut �tre utilis�e � la place d'une assertion lookbehind pour contourner la contrainte de longueur fixe.
La mise en �uvre des assertions lookbehind consiste, pour chaque alternative, � d�placer temporairement la position courante vers l�arri�re d�une longueur fix�e, puis d�essayer de matcher. S�il y a insuffisamment de caract�res avant la position courante, l'assertion �choue.
Dans le mode UTF, PCRE ne permet pas l'�chappement \C (qui matche une unit� de donn�es seule, m�me dans le mode UTF) dans les assertions lookbehind, car il est impossible de calculer la longueur d�o� il faut regarder en arri�re. Les �chappements \X et \R, qui peuvent matcher diff�rents nombres d'unit�s de donn�es, ne sont �galement pas autoris�s.
Les appels de "sous-routine" (voir ci-dessous) tels que (?2) ou (?&X) sont autoris�s dans les assertions lookbehind, dans la mesure o� le sous-mod�le matche une cha�ne de longueur fixe. Cependant, la r�cursivit� n�est pas prise en charge.
Les quantificateurs possessifs peuvent �tre utilis�s conjointement avec des assertions lookbehind pour sp�cifier un match efficace des cha�nes de longueur fixe � la fin des cha�nes sujet. Consid�rons un mod�le simple comme:
abcd$lorsqu'il est appliqu� � une longue cha�ne qui ne matche pas. Parce que le match s�effectue de gauche � droite, PCRE va regarder chaque "a" dans le sujet et ensuite voir si ce qui suit matche au reste du mod�le. Si le mod�le est d�fini par:
^.*abcd$le d�but .* matche la cha�ne enti�re en premier, mais quand cela �choue (parce qu'il n'y a pas "a" � la suite), il revient en arri�re pour matcher tout, mais le dernier caract�re, puis tout, mais les deux derniers caract�res, et ainsi de suite. Encore une fois la recherche de "a" couvre toute la cha�ne, de droite � gauche, donc nous sommes pas mieux lotis. Cependant, si le mod�le est �crit sous la forme:
^.*+(?<=abcd)il ne peut y avoir aucun backtracking pour l��l�ment .*+ ; il peut matcher seulement la cha�ne enti�re. L'assertion lookbehind subs�quente fait un seul test sur les quatre derniers caract�res. Si elle �choue, le match �choue imm�diatement. Pour les longues cha�nes, cette approche permet une diff�rence significative dans le temps de traitement.
Plusieurs assertions (de toute sorte) peuvent apparaitre dans la succession. Par exemple,
(?<=\d{3})(?<!999)foomatche "foo" pr�c�d� de trois chiffres qui ne sont pas "999". Notez que chacune des assertions est appliqu�e ind�pendamment au m�me point de la cha�ne sujet. Premi�rement, il y a une v�rification que les trois caract�res pr�c�dents sont tous des chiffres, et puis il y a une v�rification que les trois m�mes caract�res ne sont pas "999". Ce mod�le ne matche pas "foo" pr�c�d� de six caract�res, dont les premiers, sont des chiffres et les trois derniers ne sont pas "999". Par exemple, il ne matche pas "123abcfoo". Un mod�le qui le ferait, serait:
(?<=\d{3}...)(?<!999)fooCette fois, la premi�re assertion regarde les six caract�res pr�c�dents, en v�rifiant que les trois premiers sont des chiffres, puis la seconde assertion v�rifie que les trois caract�res pr�c�dents ne sont pas "999".
Les assertions peuvent �tre imbriqu�es dans une combinaison quelconque. Par exemple,
(?<=(?<!foo)bar)bazmatche une occurrence de "baz" qui est pr�c�d� par "bar" qui � son tour n�est pas pr�c�d� par "foo", tandis que:
(?<=\d{3}(?!999)...)fooest un autre mod�le qui matche "foo" pr�c�d� de trois chiffres et tous les trois caract�res qui ne sont pas "999".
Le code AutoIt suivant matche au moins deux espaces cons�cutifs mais seulement s'ils apparaissent imm�diatement apr�s un '.' et avant une lettre majuscule. Il remplace chaque s�rie d'espace trouv� par un seul espace.
$regex = "(?<=\.) {2,}(?=[A-Z])" $string = "Phrase1. Phrase2." $string = StringRegExpReplace($string, $regex, " ") msgbox(0, "", $string)
Il est possible de d�finir le processus de match pour qu�il satisfasse � un sous-mod�le conditionnel ou pour choisir entre deux sous-mod�les alternatifs, suivant le r�sultat d'une assertion, ou si un sous-mod�le de capture sp�cifique a d�j� �t� match�. Les deux formes possibles d�un sous-mod�le conditionnel sont:
(?(condition) mod�le_1) (?(condition) mod�le_1 | mod�le_2)Si la condition est satisfaite, mod�le_1 est utilis�; sinon mod�le_2 (s�il existe) est utilis�. S'il y a plus de deux alternatives dans le sous-mod�le, une erreur est lev�e. Chacune des deux alternatives peut elle-m�me contenir des sous-mod�les imbriqu�s de toute forme, y compris des sous-mod�les conditionnels; la limitation � deux alternatives s�applique uniquement au niveau de la condition. Ce fragment de mod�le est un exemple o� les alternatives sont complexes:
(?(1) (A|B|C) | (D |(?(2)E|F) | E) )
Il existe quatre sortes de conditions: les r�f�rences � des sous-mod�les, les r�f�rences � la r�cursivit�, une pseudo-condition appel�e DEFINE et les assertions.
Si le texte entre parenth�ses est une s�quence de chiffres, la condition est vraie si un sous-mod�le capturant de ce num�ro a pr�c�demment match�. S'il y a plus d'un sous-mod�le capturant avec le m�me num�ro (voir la section pr�c�dente sur les num�ros en double des sous-mod�les), la condition est vraie si l'un d'entre eux a match�. Une notation alternative accepte un signe plus ou moins devant les chiffres. Dans ce cas, le num�ro du sous-mod�le est relatif plut�t qu'absolue. Les parenth�ses les plus r�cemment ouvertes peuvent �tre r�f�renc�s par (?(-1), les suivantes les plus r�centes (?(-2), et ainsi de suite. A l'int�rieur des boucles, il peut �galement �tre judicieux de se r�f�rer � des groupes qui suivent. Les parenth�ses suivantes ouvertes peuvent �tre r�f�renc�es par (?(+1), et ainsi de suite. (La valeur z�ro dans ces formes n�est pas utilis�e; elle l�ve une erreur).
Consid�rons le mod�le suivant, qui contient des espaces blancs non significatifs pour le rendre plus lisible (en supposant l'option PCRE_EXTENDED (?x)) en divisant l�expression en trois parties pour faciliter la discussion:
( \( )? [^()]+ (?(1) \) )La premi�re partie matche une parenth�se ouvrante optionnelle, et si ce caract�re est pr�sent, il d�finit la premi�re cha�ne captur�e. La deuxi�me partie matche un ou plusieurs caract�res qui ne sont pas des parenth�ses. La troisi�me partie est un sous-mod�le conditionnel qui teste si la parenth�se ouvrante a match�. Si c�est le cas, supposons, le sujet contient une parenth�se ouvrante, la condition est vraie, et donc le mod�le_1 est ex�cut� et une parenth�se fermante est n�cessaire. Dans le cas contraire, puisque aucun mod�le_2 n'est pr�sent, le sous-mod�le ne matche rien. En d'autres termes, ce mod�le matche une s�quence de non-parenth�ses, �ventuellement entre des parenth�ses. Preuve:
$regex = "(?x) ( \( )? [^()]+ (?(1) \) )" $sujet = "chat)(chien)(cheval" _ArrayDisplay(StringRegExp($sujet, $regex, 4)[0]) _ArrayDisplay(StringRegExp($sujet, $regex, 4)[1]) _ArrayDisplay(StringRegExp($sujet, $regex, 4)[2])
Si vous int�grez ce mod�le dans un plus grand, vous pouvez utiliser une r�f�rence relative:
... autres choses ... (\()? [^()]+ (?(-1)\) ) ...Ce qui rend le fragment ind�pendant des parenth�ses dans le mod�le plus grand.
Perl utilise la syntaxe (?(<nom>)...) ou (?('nom')...) pour tester un sous-mod�le utilis� par nom. Pour la compatibilit� avec les versions ant�rieures de PCRE, qui avaient cette facilit� avant Perl, la syntaxe (?(nom)...) est �galement reconnu.
La r�-�criture de l'exemple pr�c�dent pour utiliser un sous-mod�le nomm� donne ceci:
$regex = "(?x) (?<ouvrante> \( )? [^\(\)]+ (?(ouvrante) \) )" ; |__________| |__________| ; |_______ pas d'espace ________| ; $sujet ="chat)(chien)(cheval" _ArrayDisplay(StringRegExp($sujet, $regex, 4)[0]) _ArrayDisplay(StringRegExp($sujet, $regex, 4)[1]) _ArrayDisplay(StringRegExp($sujet, $regex, 4)[2])Si le nom utilis� dans une condition de ce genre est un doublon, le test est appliqu� � tous les sous-mod�les de m�me nom, et est vrai si l'un d'entre eux est vrai.
Si la condition est la cha�ne (R), et s�il n'y a pas de sous-mod�le avec le nom R, la condition est vraie si un appel r�cursif au mod�le entier ou � un sous-mod�le a �t� fait. Si des chiffres ou un nom pr�c�d� par esperluette (&) suivent la lettre R, par exemple:
(?(R3)...) ou (?(R&nom)...)la condition est vraie si l'appel r�cursif le plus r�cent est dans un sous-mod�le dont le num�ro ou le nom est donn�. Cette condition n�analyse pas la pile enti�re de r�cursivit�. Si le nom utilis� dans une condition de ce genre est un doublon, le test est appliqu� � tous les sous-mod�les du m�me nom, et est vrai si l'un d'eux est l'appel r�cursif le plus r�cent.
Au "niveau sup�rieur", toutes ces conditions de test de r�cursivit� sont fausses. La syntaxe pour des mod�les r�cursifs est d�crite ci-dessous.
Si la condition est la cha�ne (DEFINE), et s�il n'y a pas de sous-mod�le avec le nom DEFINE, la condition est toujours fausse. Dans ce cas, il ne peut y avoir qu'une seule alternative dans le sous-mod�le. Il est toujours ignor� si le contr�le atteint ce point dans le mod�le; l'id�e de DEFINE est qu'il peut �tre utilis� pour d�finir des sous-routines qui peuvent �tre appel�es de n�importe o�. (L'utilisation de sous-programmes est d�crite ci-dessous.) Par exemple, un mod�le pour matcher une adresse IPv4 comme "192.168.23.245" pourrait �tre �crit comme ceci (ignorez les espaces et les sauts de lignes):
$regex = "(?x)" & _ "(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )" & _ "(?(DEFINE) (?<IPV4> \b (?&byte) (\.(?&byte)){3} \b) )" & _ "(?&IPV4)" _ArrayDisplay(StringRegExp("192.168.23.245", $regex, 4)[0])La premi�re partie du mod�le est un groupe DEFINE � l'int�rieur duquel un autre groupe nomm� "byte" est d�fini. Cela matche un composant d'une adresse IPv4 (un nombre inf�rieur � 256). Lors d�un match, cette partie du mod�le est saut�e car DEFINE agit comme une condition fausse. Le reste du mod�le utilise des r�f�rences pour que le groupe nomm� matche les quatre champs s�par�s par des points d'une adresse IPv4, en insistant sur une limite de mot � chaque extr�mit�.
Un autre probl�me du m�me genre consiste � matcher les comments-block d'un script AutoIt, autrement dit, les lignes comprises entre #cs ou #comments-start, et #ce ou #comments-end. La documentation pr�cise que ces blocks peuvent s'imbriquer ce qui implique une solution r�cursive:
$regex = '(?imsx) (?&Cblock)' & _ '(?(DEFINE) (?<Cblock> (?&CSline) (?: (?&Cblock)* | (?&Comment)*? )* (?&CEline) ) )' & _ '(?(DEFINE) (?<Comment> ^ \N*? (?! (?&CSline) | (?&CEline) ) \R ) )' & _ '(?(DEFINE) (?<CSline> ^ \h* \# (?: cs | comments-start ) \b \N* \R) )' & _ '(?(DEFINE) (?<CEline> ^ \h* \# (?: ce | comments-end ) \b \N* \R ) )'La premi�re ligne est un appel � un sous-mod�le r�cursif nomm� Cblock, d�fini sur la deuxi�me ligne et qui utilise lui-m�me le sous-module Comment qui � son tour utilise CSline et CEline. Nous montrons � travers cet exemple que les DEFINE peuvent appara�tre avant ou apr�s l'appel du sous-module principal.
Si la condition n�est pas dans l'un des formats ci-dessus, elle doit �tre une assertion. Cela peut �tre une assertion lookahead ou lookbehind, positive ou n�gative. Consid�rez ce mod�le, contenant de nouveau des espaces non significatifs, et avec les deux alternatives sur la seconde ligne:
(?(?=[^a-z]*[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )La condition est une assertion arri�re positive, qui matche une s�quence facultative de non-lettres suivie d'une lettre. En d'autres termes, elle teste la pr�sence d'au moins une lettre dans le sujet. Si une lettre est d�tect�e, le sujet est match� de nouveau avec la premi�re alternative; sinon, il est match� avec la seconde. Ce mod�le matche des cha�nes de l'une des deux formes dd-aaa-dd ou dd-dd-dd, o� aaa sont des lettres et dd sont des chiffres. Preuve:
$regex = "(?x)" & _ "(?(?=[^a-z]*[a-z])" & _ "\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )" _ArrayDisplay(StringRegExp("123-abc-456", $regex, 4)[0]) _ArrayDisplay(StringRegExp("123-34-567", $regex, 4)[0])
Il existe deux fa�ons d'inclure des commentaires dans les mod�les qui sont trait�s par PCRE. Dans les deux cas, le d�but du commentaire ne doit pas �tre dans une classe de caract�re, ni dans une s�quence de caract�res connexes tels que (?: ou un nom ou un num�ro de sous-mod�le. Les caract�res qui composent un commentaire ne jouent aucun r�le dans la recherche de la concordance avec le mod�le.
La s�quence (?# marque le d�but d'un commentaire qui continue jusqu'� la prochaine parenth�se fermante. Les parenth�ses imbriqu�es ne sont pas autoris�es. Si l'option PCRE_EXTENDED (?x) est d�fini, un caract�re # non �chapp� introduit �galement un commentaire, qui dans ce cas continue jusqu'au caract�re newline suivant, y compris, ou d'une s�quence de caract�res dans le mod�le. Quels caract�res sont interpr�t�s comme des newlines est contr�l�e par une s�quence sp�ciale au d�but du mod�le, tel que d�crit dans la section intitul�e "Conventions newline" ci-dessus. Notez que la fin de ce type de commentaire est une s�quence de saut de ligne litt�rale dans le mod�le; des s�quences d��chappement qui se produisent pour repr�senter un saut de ligne ne comptent pas. Par exemple, consid�rons le mod�le ci- dessous lorsque PCRE_EXTENDED (?x) est d�fini, et que la convention de saut de ligne par d�faut est en vigueur:
abc #commentaire \n encore commentaireEn rencontrant le caract�re #, le moteur pcre parcourt le commentaire � la recherche de newline dans le mod�le. La s�quence \n est toujours litt�rale � ce stade, de sorte qu'il ne termine pas le commentaire. Seul un caract�re r�el avec la valeur de code 0x0a (le saut de ligne par d�faut) le fait.
Consid�rons le probl�me du match de cha�nes entre parenth�ses, en permettant une imbrication illimit�e des parenth�ses. Sans l'utilisation de la r�cursivit�, ce qui peut �tre fait de mieux est d'utiliser un mod�le qui matche � une certaine profondeur fixe d�imbrication. Il est impossible de faire face � une profondeur d'imbrication arbitraire.
Depuis un certain temps, Perl a fourni une fonctionnalit� qui permet des expressions r�guli�res r�cursives (entre autres choses). Il le fait par interpolation de code Perl dans l'expression au moment de l'ex�cution, et le code peut se r�f�rer � l'expression elle-m�me. Un mod�le Perl qui utilise l'interpolation de code pour r�soudre le probl�me des parenth�ses peut �tre cr�� comme ceci:
$re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;L'�l�ment (?p{...}) interpole le code Perl au moment � l'ex�cution, et dans ce cas se r�f�re de mani�re r�cursive au mod�le dans lequel il appara�t.
De toute �vidence, PCRE ne peut pas supporter l'interpolation de code Perl. Au lieu de cela, il prend en charge la syntaxe sp�ciale pour la r�cursivit� sur le mod�le entier, et aussi pour la r�cursivit� d�un sous-mod�le particulier. Apr�s son introduction en PCRE et Python, ce genre de r�cursivit� a ensuite �t� introduit dans Perl � la version 5.10.
Une s�quence sp�ciale qui consiste en (? et qui est suivie d'un nombre sup�rieur � z�ro et d�une parenth�se fermante est un appel � un sous-programme r�cursif du sous-mod�le du num�ro donn�, � condition que cela se produit � l'int�rieur du sous-mod�le. (Dans le cas contraire, c�est un appel non-r�cursif � un sous-programme, qui est d�crit dans la section suivante.) La s�quence sp�ciale (?R) ou (?0) est un appel r�cursif � l'expression r�guli�re enti�re.
Ce mod�le PCRE r�sout le probl�me des parenth�ses imbriqu�es (l'option PCRE_EXTENDED (?x) est activ�e donc les espaces blanc soient ignor�s):
$regex = "(?x) \( ( [^()]++ | (?R) )* \)" _ArrayDisplay(StringRegExp("1+2*(3+4*(5+6*(7+8*9))", $regex, 4)[0])D'abord, il matche une parenth�se ouvrante. Ensuite, il matche un nombre quelconque de sous-cha�nes qui peuvent �tre soit une s�quence de caract�res qui ne sont pas des parenth�ses, soit un match r�cursif du mod�le lui-m�me (qui est, une sous-cha�ne correctement parenth�s�e). Enfin, il y a une parenth�se fermante. Notez l'utilisation d'un quantificateur possessif pour �viter le backtracking dans les s�quences de non-parenth�ses.
Si l�expression faisait partie d'un mod�le plus grand, vous ne voudriez pas la r�cursivit� sur le mod�le entier, donc � la place, vous utiliseriez ceci:
( \( ( [^()]++ | (?1) )* \) )Nous avons mis le mod�le entre parenth�ses, ce qui entraine que la r�cursivit� se r�f�re � ce mod�le au lieu de se r�f�rer au mod�le entier.
Dans un mod�le plus grand, garder une trace des num�ros de parenth�ses peut �tre difficile. Ceci est rendu plus facile par l'utilisation des r�f�rences relatives. Au lieu de (?1) dans le mod�le ci-dessus, vous pouvez �crire (?-2) pour faire r�f�rence � la deuxi�me plus r�cente parenth�se ouverte avant la r�cursivit�. En d'autres termes, un nombre n�gatif compte les parenth�ses capturantes vers la gauche � partir du point o� elle est rencontr�e.
Il est �galement possible de se r�f�rer par la suite � des parenth�ses ouvrantes, en �crivant des r�f�rences telles que (?+2). Cependant, celle-ci ne peut pas �tre r�cursive car la r�f�rence n�est pas � l'int�rieur des parenth�ses qui sont r�f�renc�s. Ce sont toujours des appels
A l'issue d'un match, les valeurs de capture entre parenth�ses sont celles du niveau le plus haut. Si vous souhaitez obtenir des valeurs interm�diaires, une fonction callout peut �tre utilis�e (voir ci-dessous et la documentation pcrecallout). Si le mod�le ci-dessus est ex�cut� sur le sujet "(ab(cd)ef)" la valeur pour la capture des parenth�ses int�rieures (num�rot�e 2) est "ef", qui est la derni�re valeur prise au plus haut niveau. Si un sous-mod�le capturant n�est pas match� au niveau sup�rieur, sa valeur finale captur�e est d�truite, m�me si elle �tait (temporairement) fix�e � un niveau plus profond au cours du processus de match.
S'il y a plus de 15 parenth�ses de capture dans un mod�le, PCRE doit obtenir davantage de m�moire pour stocker des donn�es lors d'une r�cursivit�, ce qu'il fait en utilisant pcre_malloc, la lib�rant via pcre_free apr�s. Si aucune m�moire peut �tre obtenu, le match �choue avec l'erreur PCRE_ERROR_NOMEMORY.
Ne confondez pas la s�quence (?R) avec la condition (R), qui teste la r�cursivit�. Consid�rez le mod�le ci-dessous, qui matche un texte entre <>, permettant l'imbrication arbitraire. Seuls les chiffres sont autoris�s entre <> imbriqu�s (lors des appels r�cursifs), alors que tous les caract�res sont autoris�s au niveau externe.
$regex = "(?x) < (?: (?(R) \d++ | [^<>]*+) | (?R)) * >"
; |____________________|
; |________________________________|
_ArrayDisplay(StringRegExp("a<bc<12>de>f", $regex, 4)[0])
Dans ce mod�le, (?(R) est le d�but d'un mod�le conditionnel, avec deux alternatives diff�rentes pour les cas r�cursif et non r�cursif. L'�l�ment (?R) est l'appel r�cursif r�el.
Le traitement r�cursif dans PCRE diff�re de Perl de deux fa�ons importantes. Dans PCRE (comme Python, mais contrairement � Perl), un appel � un sous-mod�le r�cursif est toujours trait� comme un groupe atomique. Autrement dit, une fois qu'il a match� quelque chose dans la cha�ne sujet, le mod�le n�est jamais r�-entr�, m�me si ce sous-mod�le contient des alternatives non essay�es ou s�il y a un �chec de match ult�rieurement. Ceci peut �tre illustr� par le mod�le suivant, qui est cens� matcher une cha�ne palindrome qui contient un nombre impair de caract�res (par exemples, "a", "aba", "ABCBA", "abcdcba"):
^(.|(.)(?1)\2)$L'id�e est que, soit le mod�le matche un seul caract�re, soit il matche deux caract�res identiques entourant un sous-palindrome. En Perl, ce mod�le fonctionne; en PCRE non, si le mod�le a plus de trois caract�res. Consid�rons la cha�ne sujet "abcba":
Au niveau sup�rieur, le premier caract�re "a" est match�, mais comme il n'est pas � la fin de la cha�ne, la premi�re alternative �choue; la seconde alternative est prise et la r�cursivit� agit. L'appel r�cursif au sous-mod�le 1 matche avec succ�s le caract�re suivant "b". (Notez que les tests de d�but et de fin de ligne ne font pas partie de la r�cursivit�).
Donc retour au niveau sup�rieur, le caract�re suivant "c" est compar� avec ce que le sous-mod�le 2 a match�, qui �tait "a". Cela �choue. Parce que la r�cursivit� est trait�e comme un groupe atomique, il y a maintenant aucun point de backtracking, et ainsi le match entier �choue. (Perl est en mesure, � ce stade, de r�-entrer la r�cursivit� et d�essayer la seconde alternative.) Toutefois, si le mod�le est �crit avec les alternatives dans l�autre sens, les choses sont diff�rentes:
^((.)(?1)\2|.)$Cette fois, l'alternative r�cursive est essay�e en premier, et continue la r�cursivit� jusqu'� �puisement des caract�res, � ce point la r�cursivit� �choue. Mais cette fois, nous avons une autre alternative pour essayer au plus haut niveau. Telle est la grande diff�rence: dans le cas pr�c�dent l'alternative restante est � un niveau de r�cursivit� plus profond, que PCRE ne peut pas utiliser.
$regex = "^((.)(?1)\2|.)$" _ArrayDisplay(StringRegExp("abcxcba", $regex, 4)[0])
Pour modifier le mod�le afin qu'il matche toutes les cha�nes de palindromes, pas seulement celles qui ont un nombre impair de caract�res, il est tentant de changer le mod�le comme ceci:
^((.)(?1)\2|.?)$Encore une fois, cela fonctionne en Perl, mais pas dans PCRE, et pour la m�me raison. Quand une r�cursivit� en profondeur a match�e un seul caract�re, elle ne peut pas �tre entr� de nouveau afin de matcher une cha�ne vide. La solution consiste � s�parer les deux cas, et �crire les cas impairs et pairs comme des alternatives au niveau sup�rieur:
$regex = "(?x) ^(?: ( (.)(?1)\2 | ) | ((.)(?3)\4 | .) )$" _ArrayDisplay(StringRegExp("abccba", $regex, 4)[0])Si vous voulez matcher les phrases palindromes typiques, le mod�le doit ignorer tous les caract�res non-mot, ce qui peut �tre fait comme ceci:
$regex = "(?xi) ^\W*+ (?: ((.)\W*+(?1)\W*+\2 | ) | ((.)\W*+(?3)\W*+\4 | \W*+.\W*+) ) \W*+$" _ArrayDisplay(StringRegExp("A man, a plan, a canal: Panama!", $regex, 4)[0])Si l'option PCRE_CASELESS (?i) est activ�e, ce mod�le matche des phrases telles que "A man, a plan, a canal: Panama!" et il fonctionne bien � la fois dans PCRE et Perl. Notez l'utilisation du quantificateur possessif *+ pour �viter le backtracking dans les s�quences de caract�res non-mot. Sans cela, PCRE prendrait beaucoup plus de temps (dix fois ou plus) pour matcher des phrases simples, et Perl prendrait tellement de temps que vous pourriez penser qu'il est entr� dans une boucle sans fin.
AVERTISSEMENT: Les mod�les ci-dessus qui matchent des palindromes ne fonctionne que si la cha�ne sujet ne d�bute pas avec un palindrome qui est plus court que la cha�ne enti�re. Par exemple, bien que "abcba" soit correctement match�, si le sujet est "ababa", PCRE trouve le palindrome "aba" au d�but, puis �choue au niveau le plus haut parce que la fin de la cha�ne ne suit pas. Encore une fois, le moteur ne peut pas revenir en arri�re dans la r�cursivit� pour essayer d'autres alternatives, donc tout le match �choue.
La deuxi�me fa�on dont PCRE et Perl diff�rent dans leur traitement de la r�cursivit� est dans le traitement des valeurs captur�es. En Perl, quand un sous-mod�le est appel� r�cursivement ou comme un sous-mod�le (voir la section suivante), il n'a pas acc�s � toutes les valeurs qui ont �t� captur�es en dehors de la r�cursivit�, alors que dans PCRE ces valeurs peuvent �tre r�f�renc�es. Consid�rez ce mod�le:
^(.)(\1|a(?2))Dans PCRE, ce mod�le matche "bab". Les premieres parenth�ses de capture matchent "b", puis dans le deuxi�me groupe, lorsque la r�f�rence arri�re \1 �choue pour matcher "b", la deuxi�me alternative matche "a" et entre ensuite dans la r�cursivit�. Dans la r�cursivit�, \1 matche maintenant "b" et ainsi l'ensemble du match r�ussit. En Perl, le mod�le �choue parce que dans l'appel r�cursif \1 ne peut pas acc�der � la valeur d�finit � l'ext�rieur.
Si la syntaxe d'un appel d�un sous-mod�le r�cursif (par num�ro ou par nom) est utilis�e en dehors des parenth�ses auxquelles il se r�f�re, il op�re comme un sous-programme dans un langage de programmation. Le sous-mod�le appel� peut �tre d�fini avant ou apr�s la r�f�rence. Une r�f�rence num�rot�e peut �tre absolue ou relative, comme dans ces exemples:
(...(absolute)...)...(?2)... (...(relative)...)...(?-1)... (...(?+1)...(relative)...Un exemple ant�rieur a fait remarquer que le mod�le:
(perplex|complex)e et \1it�matche "perplexe et perplexit�" et "complexe et complexit�", mais pas "perplexe et complexit�". Alors que le mod�le:
(perplex|complex)e et (?1)it�matche "perplexe et complexit�" aussi bien que les deux autres cha�nes. Un autre exemple est donn� dans la section DEFINE ci-dessus.
Tous les appels de sous-programme, r�cursif ou non, sont toujours trait�s comme des groupes atomiques. Autrement dit, une fois qu�un sous-programme a match� quelque chose dans la cha�ne sujet, il n�est jamais re-entr� de nouveau, m�me si il contient des alternatives non essay�es ou s�il y a un �chec de match ult�rieur. Des parenth�ses capturantes qui sont d�finies lors de l'appel du sous-programme reviennent � leurs valeurs pr�c�dentes apr�s.
Les options de traitement telles que l�insensibilit� � la casse sont fix�s lorsqu'un sous-mod�le est d�fini, donc si il est utilis� comme un sous-programme, ces options ne peuvent pas �tre modifi�s pour des appels diff�rents. Par exemple, consid�rons ce mod�le:
(abc)(?i:(?-1))Il matche "abcabc". Il ne matche pas "abcABC" parce que le changement d'option de traitement ne concerne pas le sous-mod�le appel�.
$regex = "(abc)(?i:(?-1))" msgbox(0,"abcabc",StringRegExp("abcabc", $regex, 0)) msgbox(0,"abcABC",StringRegExp("abcABC", $regex, 0))
Pour la compatibilit� avec Oniguruma, la syntaxe non-Perl \g suivie d'un nom ou d'un nombre entour� de crochets ou de simples guillemets, est une syntaxe alternative pour r�f�rencer un sous-mod�le en tant que sous-programme, �ventuellement r�cursif. Ci-joint, deux des exemples utilis�s ci-dessus, r��crits en utilisant cette syntaxe:
(?<pn> \( ( (?>[^()]+) | \g<pn> )* \) ) (sens|respons)e and \g'1'ibilityPCRE supporte une extension de Oniguruma: si un nombre est pr�c�d� par le signe plus ou moins, il devient une r�f�rence relative. Par exemple:
(abc)(?i:\g<-1>)Notez que \g{...} (syntaxe Perl) et \g<...> (syntaxe Oniguruma) ne sont pas synonymes. Le premier est une r�f�rence arri�re; le second un appel � un sous-programme.
Cette fonctionnalit� n'est pas utilisable avec AutoIt.
Perl dispose d'une fonction pour laquelle l'utilisation de la s�quence (?{...}) permet d'ob�ir � un code Perl arbitraire au milieu d�un match d'une expression r�guli�re. Ceci permet, entre autre, d'extraire les diff�rentes sous-cha�nes qui matchent la m�me paire de parenth�ses quand il y a une r�p�tition.
PCRE fournit une fonctionnalit� semblable, mais bien s�r, ne peut pas ob�ir � un code Perl arbitraire. Le concept est appel�e "callout". L'appelant de PCRE fournit une fonction externe en mettant son point d'entr�e dans la variable globale pcre_callout(8-bit library) ou pcre[16|32]_callout (16-bit ou 32-bit library). Par d�faut, cette variable contient NULL, ce qui d�sactive tous les appels externes.
Dans une expression r�guli�re, (?C) indique les points o� la fonction externe doit �tre appel�e. Si vous voulez identifier les diff�rents points de callout, vous pouvez mettre un nombre inf�rieur � 256 apr�s la lettre C. La valeur par d�faut est z�ro. Par exemple, ce mod�le a deux points callout:
(?C1)abc(?C2)defSi le flag PCRE_AUTO_CALLOUT est pass� � une fonction de compilation, les callouts sont automatiquement install�s avant chaque �l�ment du mod�le. Ils sont tous num�rot�s 255. S'il y a un groupe conditionnel dans le mod�le dont la condition est une assertion, un callout suppl�mentaire est ins�r� juste avant la condition. Un callout explicite peut aussi �tre d�fini � cette position, comme dans l'exemple:
(?(?C9)(?=a)abc|def)Notez que cela s'applique uniquement aux conditions assertions, pas aux autres types de condition.
Pendant un match, lorsque PCRE atteint un point de callout, la fonction externe est appel�e. Elle est fournie avec le num�ro du callout, la position dans le mod�le, et, facultativement, un �l�ment de donn�e fourni � l'appelant de la fonction de match. La fonction callout peut entra�ner le backtracking, ou �chouer compl�tement.
Par d�faut, PCRE impl�mente un certain nombre d'optimisations au moment de la compilation et pendant le match, et un effet de bord se produit en ignorant parfois les appels. Si vous avez besoin de tous les appels possibles, vous devez d�finir les options qui d�sactivent les optimisations pertinentes. Plus de d�tails et une description compl�te de l'interface de la fonction callout, sont donn�s dans la documentation pcrecallout.
Perl 5.10 introduit un certain nombre de "Verbes sp�ciaux de contr�le du Backtracking", qui sont d�crits dans la documentation Perl comme "exp�rimental et sujet � modifications ou � suppression dans une version future de Perl". Elle poursuit en disant: "Leur utilisation dans un code de production devrait le noter pour �viter des probl�mes lors des mises � jour. Les m�mes remarques s�appliquent aux caract�ristiques PCRE d�crites dans cette section.
Les nouveaux verbes utilisent une syntaxe auparavant invalide: une parenth�se ouvrante suivie d'un ast�risque. Ils sont g�n�ralement de la forme (*VERB) ou (*VERB:NOM). Certains peuvent prendre n'importe quelle forme, et il est possible qu'ils se comportent diff�remment selon qu'un nom est pr�sent ou non. Un nom est n'importe quelle s�quence de caract�res qui n'inclut pas de parenth�se fermante. Le maximum de la longueur d'un nom est 255 dans la biblioth�que 8 bits et 65535 dans les biblioth�ques 16 bits et 32 bits. Si le nom est vide, c'est-�-dire si la parenth�se fermante suit imm�diatement le caract�re deux-points, l'effet est comme si le : n'�tait pas l�. N'importe quel nombre de ces verbes peut appara�tre dans un mod�le.
�tant donn� que ces verbes sont sp�cifiquement li�s au backtracking, la plupart d'entre eux peuvent �tre utilis�s que lorsque le mod�le doit matcher en utilisant l'une des fonctions de match traditionnelles, parce qu'elles utilisent un algorithme de backtracking. A l'exception de (*FAIL), qui se comporte comme l��chec d�une assertion n�gative, les verbes de contr�le du backtraking provoquent une erreur si ils sont rencontr�s par une fonction de match DFA.
Le comportement de ces verbes dans groupes r�p�t�s, assertions, et dans Sous-mod�les appel�s comme sous-programmes (r�cursif ou pas) est document� ci-dessus.
PCRE contient quelques optimisations qui sont utilis�s pour acc�l�rer le match en ex�cutant certains contr�les au d�but de chaque tentative de match. Par exemple, il peut savoir la longueur minimale du sujet correspondant, ou si un caract�re particulier doit �tre pr�sent. Lorsque l'une de ces optimisations supprime le d�roulement d'un match, tous les verbes de backtracking inclus ne seront pas trait�s, bien s�r. Vous pouvez supprimer les optimisations de d�but de match en mettant l'option PCRE_NO_START_OPTIMIZE lorsque vous appelez pcre_compile() ou pcre_exec() , ou en d�marrant le mod�le avec (*NO_START_OPT). ll y a plus de d�tails dans la section intitul�e "Bits d'option pour pcre_exec()" dans la documentation pcreapi.
Des exp�riences avec Perl sugg�rent qu'il a trop d�optimisations similaires, conduisant parfois � des r�sultats anormaux.
Les verbes suivants agissent d�s qu'ils sont rencontr�s dans le mod�le. Ils ne peuvent pas �tre suivis par un nom.
(*ACCEPT)Ce verbe force le match � se terminer avec succ�s, en sautant le reste du mod�le. Cependant, quand il est � l'int�rieur d'un sous-mod�le, ce qui est le cas lorsqu�il est appel� comme un sous-programme, seulement le sous-mod�le se termine avec succ�s. Le match continue alors au niveau externe. Si (*ACCEPT) est d�clench� dans une assertion positive, l'assertion r�ussit; dans une assertion n�gative, l'assertion �choue.
Si (*ACCEPT) est � l'int�rieur de parenth�ses capturantes, les donn�es jusqu'� cet instant sont captur�es. Par exemple le mod�le:
A((?:A|B(*ACCEPT)|C)D)matche "AB", "AAD", ou "ACD"; quand il matche "AB", alors "B" est captur� par les parenth�ses ext�rieures.
$regex = "A((?:A|B(*ACCEPT)|C)D)" _ArrayDisplay(StringRegExp("AB", $regex, 4)[0]) _ArrayDisplay(StringRegExp("AAD", $regex, 4)[0]) _ArrayDisplay(StringRegExp("ACD", $regex, 4)[0])
(*FAIL) ou (*F)Ce verbe provoque un �chec de match, for�ant le backtracking � se produire. Il est �quivalent � (?!), mais plus facile � lire. La documentation Perl fait remarquer qu'il est probablement utile que lorsqu'il est combin� avec (?{}) ou (??{}). Ce sont, bien s�r, des caract�ristiques Perl qui ne sont pas pr�sentes dans PCRE. L'�quivalent le plus proche est la caract�ristique callout, comme par exemple dans ce mod�le:
a+(?C)(*FAIL)Un match avec la cha�ne "aaaa" �choue toujours, mais le callout est pris avant chaque backtrack (dans cet exemple, 10 fois).
Cette section n'est pas utilisable avec AutoIt.
Il y a un verbe dont le but principal est de traquer comment un match a r�ussi, mais il a aussi une utilisation secondaire en conjonction avec l'avancement du point de match de d�part (voir (*SKIP) ci-dessous).
(*MARK:NAME) or (*:NAME)Un nom est toujours n�cessaire avec ce verbe. Il peut y avoir autant d�instances de (*MARK) que vous le souhaitez dans un mod�le, et leurs noms ne doivent pas n�cessairement �tre unique.
Lorsqu'un match r�ussit, le nom du dernier rencontr� (*MARK:NAME), (*PRUNE:NAME), ou (*THEN:NAME) sur le chemin du match est retourn� � l'appelant comme d�crit dans la section intitul�e "Donn�es suppl�mentaires pour pcre_exec()" dans la documentation pcreapi. Voici un exemple de sortie de pcretest, o� le modificateur /K demande la r�cup�ration et l�affichage des donn�es (*MARK):
re> /X(*MARK:A)Y|X(*MARK:B)Z/K data> XY 0: XY MK: A XZ 0: XZ MK: BLe nom (*MARK) est not� par "MK:" dans cette sortie, et dans cet exemple, il indique lequel des deux alternatives a match�. Ceci est un moyen plus efficace d'obtenir cette information que de mettre chaque alternative dans ses propres parenth�ses capturantes.
Si un verbe avec un nom est rencontr� dans une assertion positive qui est vraie, le nom est enregistr� et pass� en retour s'il est le dernier rencontr�. Cela ne se produit pas pour les assertions n�gatives pour les assertions n�gatives ou les assertions positives en �chec.
Apr�s un match partiel ou un match �chou�, le dernier nom rencontr� dans le processus de mach entier est retourn�. Par exemple:
re> /X(*MARK:A)Y|X(*MARK:B)Z/K data> XP No match, mark = BNotez que dans cet exemple non ancr� la mark est conserv�e dans la tentative de match qui a commenc� � la lettre "X" dans le sujet. Le match suivant tente de commencer � "P" et puis avec une cha�ne vide n'obtient pas aussi loin que l'�l�ment (*MARK), mais n�anmoins ne le r�initialise pas.
Si vous �tes int�ress� par les valeurs de (*MARK) apr�s l'�chec d'un match, vous d�finirez probablement l'option PCRE_NO_START_OPTIMIZE (voir ci-dessous) pour vous assurer que le match est toujours tent�.
Les verbes suivants ne font rien quand ils sont rencontr�s. Le processus de match continue avec ce qui suit, mais s'il n'y a pas de match ult�rieur, provoquant un retour en arri�re au verbe, un �chec est forc�. Autrement dit, le backtracking ne peut pas passer � la gauche du verbe. Cependant, lorsque l'un de ces verbes appara�t � l'int�rieur d'un groupe atomique ou une assertion qui est vraie, son effet est limit� � ce groupe, car une fois que le groupe a �t� identifi�, il n'y a jamais backtracking en lui. Dans cette situation, le backtracking peut "sauter en arri�re" � la gauche du groupe atomique entier. (Rappelez-vous aussi, comme indiqu� ci-dessus, que cette localisation est �galement valable dans les appels de sous-programmes.)
Ces verbes diff�rent suivant le type d'�chec qui se produit lorsque le backtracking les atteint. Le comportement d�crit ci-dessous est ce qui se passe quand le verbe n'est pas dans un sous-programme ou une assertion. Les sections suivantes couvrent ce cas.
(*COMMIT)Ce verbe, qui ne peut �tre suivi d'un nom, entraine le match entier � l'�chec pur et simple si le reste du mod�le ne matche pas. M�me si le mod�le n'est pas ancr�, aucune autre tentative pour trouver un match en faisant avancer le point de d�part n'a lieu. Si (*COMMIT) est le seul verbe concern� par le backtracking, pcre_exec() est d�termin� � trouver un match au point de d�part actuel, ou pas du tout. Par exemple:
a+(*COMMIT)bmatche "xxaab" mais pas "aacaab":
$regex = "a+(*COMMIT)b" Msgbox(0, "xyaab", StringRegExp("xyaab", $regex, 0)) ; r�ussite du match Msgbox(0, "aacaab", StringRegExp("aacaab", $regex, 0)); �chec du matchIl peut �tre consid�r� comme une sorte d'ancrage dynamique, ou "j'ai commenc�, je dois finir". Le nom pass� le plus r�cemment par (*MARK) dans le chemin est retourn� quand (*COMMIT) force un �chec de match.
S'il y a plus d'un verbe de backtracking dans un mod�le, un verbe diff�rent qui suit (*COMMIT) peut �tre d�clench� en premier, donc simplement passer (*COMMIT) pendant un match ne garantit pas toujours qu'un match doit �tre � ce point de d�part.
Notez que (*COMMIT) au d�but d'un mod�le n'est pas la m�me chose que l'ancrage, � moins que les optimisations de d�but de match de PCRE soient d�sactiv�es, comme le montre cet exemple de pcretest:
re> /(*COMMIT)abc/ data> xyzabc 0: abc data> xyzabc\Y No matchPour ce mod�le, PCRE sait que tout match doit commencer par "a", de sorte que l'optimisation saute dans le sujet � "a" avant d'appliquer le mod�le au premier ensemble de donn�es. Ce math tente alors de r�ussir. Dans un second ensemble de donn�es, la s�quence d'�chappement \Y est interpr�t�e par la programme pcretest. Ce qui entraine l'activation de l'option PCRE_NO_START_OPTIMIZE quand pcre_exec() est appel�e. Cela d�sactive l'optimisation qui passe au premier caract�re. le mod�le est maintenant appliqu� en commen�ant � "x", et ainsi le (*COMMIT) entraine l'�chec du match sans essayer d'autres points de d�part.
(*PRUNE) or (*PRUNE:NAME)Ce verbe entraine l'�chec du match � la position courante de d�part dans le sujet si il y a un �chec du match suivant provoque le backtracking. Si le mod�le n'est pas ancr�, l' "avance cahotique" normale avance alors au caract�re de d�part suivant. Le backtracking peut se produire comme d'habitude � la gauche de (*PRUNE), mais s'il n'y a pas de match � droite, le baktracking ne peut pas traverser (*PRUNE). Dans les cas simples, l'utilisation de (*PRUNE) est juste une alternative � un groupe atomique ou � un quantificateur possessif, mais il y a quelques utilisations de (*PRUNE) qui ne peuvent s'exprimer d'une autre mani�re. Dans un mod�le ancr� (*PRUNE) a le m�me effet que (*COMMIT).
Le comportement de (*PRUNE:NAME) n'est pas le m�me que (*MARK:NAME)(*PRUNE). C'est le m�me que (*MARK: NAME) en ce que le nom est m�moris� pour le retour � l'appelant. Cependant, (*SKIP: NAME) recherche uniquement les noms d�finis avec (*MARK).
(*SKIP)Ce verbe, lorsqu'il est utilis� sans nom, est comme (*PRUNE), sauf que si le mod�le n'est pas ancr�, l'avance "cahotique" n'est pas le caract�re suivant, mais la position dans le sujet o� (*SKIP) a �t� rencontr�e. (*SKIP) signifie que quel que soit le texte qui a match� il ne peut pas faire partie d'un match r�ussi. Consid�rez:
a+(*SKIP)bSi le sujet est "aaaac ...", apr�s la premi�re tentative de match �chou�e (en commen�ant par le premier caract�re de la cha�ne), le point de d�part saute pour commencer la prochaine tentative � "c". A noter qu'un quantificateur possessif n'a pas le m�me effet dans cet exemple; bien qu'il supprimerait le backtracking pendant la premi�re tentative de match, la deuxi�me tentative commencerait au deuxi�me caract�re au lieu de sauter sur "c".
(*SKIP:NAME)Lorsque (*SKIP) a un nom associ�, son comportement est modifi�. Si le mod�le suivant ne match pas, le chemin pr�c�dent � travers le mod�le est recherch� pour le plus r�cent (*MARK) qui a le m�me nom. Si un est trouv�, l'avance cahotique est la position du sujet qui correspond � ce (*MARK) au lieu de l'endroit o� (* SKIP) a �t� rencontr�e. Si aucun (*MARK) avec un nom correspondant est trouv�, le (*SKIP) est ignor�.
Notez que (*SKIP:NAME) cherche seulement les noms d�finis par (*MARK:NAME). Il ignore les noms qui sont d�finis par (*PRUNE:NAME) ou (*THEN:NAME).
(*THEN) or (*THEN:NAME)Ce verbe provoque un saut � l'alternative suivante la plus interne lorsque le backtracking est d�clench�. Autrement dit, il annule l'attente du backtracking � l'int�rieur de l'alternative courante. Son nom provient de l'observation qui peut �tre utilis� pour un bloc if-then-else dans le mod�le:
( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...Si le mod�le COND1 matche, FOO est essay� (et �ventuellement d'autres �l�ments apr�s la fin du groupe si FOO r�ussit); en cas d'�chec, l'matcher saute � la seconde alternative et tente COND2, sans backtracking dans COND1. Si succ�s et si BAR �choue, COND3 est essay�e. Si ensuite BAZ �choue, il n'y a plus d'alternative, donc il y un retour arri�re vers tout ce qui est venu avant le groupe entier. If (*THEN) n'est pas dans une alternative, il agit comme (*PRUNE).
Le comportement de (*THEN:NAME) n'est pas le m�me que (* MARK: NAME) (* THEN). Il est comme (*MARK:NAME) en ce que le nom est rappel� pour le renvoi � l'appelant. Cependant, (*SKIP:NAME) recherche uniquement les noms d�finis avec (* MARK).
Un sous-mod�le qui ne contient pas de caract�re | est juste une partie de l'alternative dans les parenth�ses; il n'est pas une alternation imbriqu�e avec une seule alternative. L'effet de (*THEN) va au-del� d'un tel sous-mod�le d'alternative entre parenth�ses. Consid�rez ce mod�le, o� A, B, etc. sont des fragments de mod�les complexes qui ne contiennent pas de | � ce niveau:
A (B(*THEN)C) | DSi A et B sont match�s, mais qu'il y a un �chec dans C, le moteur ne fait pas de backtracking dans A; � la place, il se d�place � l'alternative suivante, qui est, D. Toutefois, si le sous-mod�le contenant (* THEN) est donn� par une alternative, il se comporte diff�remment:
A (B (*THEN)C | (*FAIL)) | DL'effet de (*THEN) est maintenant limit� au sous-mod�le int�rieur. Apr�s un �chec en C, le moteur se d�place vers (*FAIL), ce qui entraine l'�chec du sous-mod�le entier car il n'y a pas d'autres alternatives pour essayer. Dans ce cas, le moteur maintenant retourne en arri�re en A.
Notez qu'un sous-mod�le conditionnel n'est pas consid�r� comme ayant deux alternatives, car une seule est utilis�e. En d'autres termes, le caract�re | dans un sous-mod�le conditionnel a une signification diff�rente. En ignorant les espaces blancs, consid�rez:
^.*? (?(?=a) a | b(*THEN)c )Si le sujet est "ba", ce mod�le ne matche pas. Car .*? est frugal, il matche s'il y a z�ro caract�re au d�but. La condition (?=A) �choue alors, le caract�re "b" est match�, mais "c" ne l'est pas. � ce stade, le moteur ne revient pas en arri�re vers .*? comme on peut s'y attendre avec la pr�sence du caract�re |. La parenth�se conditionnelle fait partie de l'alternative unique qui comprend le mod�le entier, et ainsi le match �choue. (S'il y avait un retour en arri�re dans .*?, lui permettant de matcher "b", le match aurait r�ussi.)
Les verbes qui viennent d'�tre d�crits fournissent quatre "forces" diff�rentes de contr�le quand les matchs successifs �chouent. (*THEN) est la plus faible, portant sur le match � l'alternative suivante. (*PRUNE) vient ensuite, � d�faut du match � la position de d�part actuelle, mais permettant une avance au caract�re suivant (pour un mod�le non ancr�). (*SKIP) est similaire, sauf que l'avance peut �tre de plus d'un caract�re. (*COMMIT) est la plus forte, ce qui provoque l'�chec du match entier.
Si plus d'un verbe de backtracking est pr�sent dans un mod�le, celui qui subit le backtracking agit en premier. Par exemple, consid�rons ce mod�le, o� A, B, etc. sont des fragments de motifs complexes:
�� (A(*COMMIT)B(*THEN)C|ABD)Si A matche mais que B �choue, le retour arri�re vers (*COMMIT) provoque l'�chec du match entier. Cependant, si A et B matchent, mais que C �choue, le retour arri�re � (*THEN) provoque l'essai de l'alternative suivante (ABD). Ce comportement est coh�rent, mais n'est pas toujours pareil que celui de Perl. Cela signifie que si deux ou plusieurs verbes de backtracking apparaissent successivement, le tout dernier d'entre eux n'a aucun effet. Consid�rons cet exemple:
�� ...(*COMMIT)(*PRUNE)...S'il y a un �chec du match � droite, le backtracking sur (*PRUNE) entraine qu'il doit �tre d�clench�, et son action est prise. Il ne peut jamais y avoir de retour en arri�re sur (*COMMIT).
PCRE diff�re de Perl dans sa gestion des verbes backtracking dans les groupes r�p�t�s. Par exemple, consid�rez:
�� (a(*COMMIT)b)+acSi le sujet est "abac", Perl matches, mais PCRE �choue parce que (*COMMIT) dans la deuxi�me r�p�tition du groupe agit.
(*FAIL) dans une assertion a son effet normal: il force un retour arri�re imm�diat.
(*ACCEPT) dans une assertion positive provoque la r�ussite de l'assertion sans aucun traitement ult�rieur. Dans une assertion n�gative, (*ACCEPT) provoque l'�chec de l'assertion sans autre traitement.
Les autres verbes backtracking ne sont pas trait�s sp�cialement s'ils apparaissent dans une assertion positive. En particulier, (*THEN) passe � l'alternative suivante dans le groupe le plus interne qui a des alternances, que ce soit ou non dans l'assertion.
Les affirmations n�gatives sont toutefois diff�rentes, afin de garantir que le changement d'une assertion positive en une assertion n�gative change son r�sultat. Le baktracking dans (*COMMIT), (*SKIP) ou (*PRUNE) entraine qu'une assertion n�gative est vraie, sans consid�rer d'autres branches alternatives dans l'assertion. Le backtracking dans (*THEN) le fait passer � la prochaine alternative englobante dans l'assertion (le comportement normal), mais si l'assertion n'a pas une telle alternative, (*THEN) se comporte comme (*PRUNE).
Ces comportements se produisent si le mod�le est appel� r�cursivement ou non. Le traitement par Perl des sous-programmes est diff�rent dans certains cas.
(*FAIL) dans un sous-mod�le appel� comme sous-programme a son effet normal: il force un backtracking imm�diat.
(*ACCEPT) dans un sous-mod�le appel� comme sous-programme provoque le succ�s du match du sous-programme sans aucun traitement suppl�mentaire. Le match se poursuit ensuite apr�s l'appel de sous-programme.
(*COMMIT), (*SKIP) et (*PRUNE) dans un sous-mod�le appel� comme sous-programme provoque l'�chec du sous-programme.
(*THEN) passe � l'alternative suivante dans le groupe le plus proche englobant � l'int�rieur du sous-mod�le qui a les alternatives. S'il n'y a pas de tel groupe dans le sous-mod�le, (*THEN) provoque l'�chec du match du sous-programme.
pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3), pcre16(3), pcre32(3).
Philip Hazel / Traduction danielm
University Computing Service
Cambridge CB2 3QH, England.
Last updated: 08 January 2014
Copyright © 1997-2014 University of Cambridge.