Différences avec Perl
Les différences avec Perl 5.005 sont présentées ici :
-
Par défaut, un caractère d'espacement correspond à
n'importe quel caractère que la fonction C isspace() reconnaît,
bien qu'il soit possible de recompiler la bibliothèque PCRE avec
d'autres tables de caractères. Normalement, isspace() retourne
TRUE
pour les espaces, les retours chariot, les
nouvelles lignes, les formfeed, les tabulations verticales et horizontales.
Perl 5 n'accepte plus la tabulation verticale comme caractère
d'espacement. La séquence \v qui était dans la documentation
Perl depuis longtemps n'a jamais été reconnue. Cependant, la
tabulation verticale elle-même était reconnue comme un
caractère d'espacement jusqu'à la version 5.002. Avec les
versions 5.004 et 5.005, l'option \s l'ignore.
-
PRCE ne tolère pas la répétition de quantificateurs
dans les expressions. Perl le permet, mais cela ne signifie pas ce que vous
pourriez penser. Par exemple, (?!a){3} ne s'interprète pas : les trois
caractères suivants ne sont pas des "a". En fait, cela
s'interprète comme : le caractère suivant n'est pas "a" trois fois.
-
Les occurrences de sous-masques qui interviennent dans des assertions
négatives sont comptées, mais elles ne sont pas
enregistrées dans le vecteur d'occurrences. Perl modifie ses
variables numériques pour toutes les occurrences de sous-masque,
avant que l'assertion ne vérifie le masque entier, et uniquement si
les sous-masques ne trouvent qu'une seule occurrence.
-
Bien que les caractères nul soient tolérés dans la
chaîne de recherche, ils ne sont pas acceptés dans le
masque, car le masque est utilisé comme une chaîne C
standard, terminée par le caractère nul. Il faut donc
utiliser la séquence d'échappement "\x00" dans le masque
pour rechercher les caractères nul.
-
Les séquences d'échappement suivantes ne sont pas
supportées par Perl : \l, \u, \L, \U.
En fait, elles sont implémentées par la gestion
intrinsèque de chaînes Perl, et ne font pas partie
de ses caractères spéciaux.
-
L'assertion \G du Perl n'est pas supportée car elle n'est pas
pertinente pour faire des recherches avec des masques uniques.
-
De manière assez évidente, PCRE n'accepte pas la
construction (?{code}) et (??{code}).
Cependant, les masques récursifs sont supportés.
-
Au moment de l'écriture de PCRE, Perl 5.005_02 avait quelques
comportements étranges avec la capture des chaînes
lorsqu'une partie du masque est redoublée. Par exemple, "aba" avec
le masque /^(a(b)?)+$/ va affecter à $2 la valeur "b", mais la
même manipulation avec "aabbaa" et /^(aa(bb)?)+$/ laissera $2 vide.
Cependant, si le masque est remplacé par /^(aa(b(b))?)+$/ alors $2
(et d'ailleurs $3) seront correctement affectés. Avec le Perl
5.004, $2 sera correctement affecté dans les deux cas, et c'est
aussi vrai avec PCRE. Si Perl évolue vers un autre comportement
cohérent, PCRE s'adaptera probablement.
-
Une autre différence encore non résolue est le fait qu'en
Perl 5.005_02 le masque /^(a)?(?(1)a|b)+$/ accepte la chaîne "a",
tandis que PCRE ne l'accepte pas. Cependant, que ce soit avec Perl ou
PCRE /^(a)?a/ et "a" laisseront $1 vide.
-
PCRE propose quelques extensions aux expressions rationnelles du Perl.
-
(a) Bien que les assertions arrières (lookbehind) soient obligées
de rechercher une chaîne de longueur fixe, toutes les assertions
arrières peuvent avoir une longueur différente. Perl 5.005 leur
impose d'avoir toutes la même longueur.
-
(b) Si PCRE_DOLLAR_ENDONLY est
activé, et que PCRE_MULTILINE
ne l'est pas, le métacaractère $ ne s'applique qu'à
la fin physique de la chaîne, et non pas avant les caractères
de nouvelle ligne.
-
(c) Si PCRE_EXTRA est
activé, un antislash suivi d'une lettre sans signification
spéciale est considéré comme une erreur.
-
(d) Si PCRE_UNGREEDY est
activé, la "gourmandise" des quantificateurs de
répétition est inversée, ce qui est rend non
gourmand par défaut, mais s'ils sont suivis de ?, il seront
gourmands.