9.6. Correspondance de modèles

Il existe trois différents approches aux correspondances de modèles fournies par PostgreSQL: l'opérateur SQL traditionnel LIKE, le plus récent SIMILAR TO de SQL99 et les expressions rationnelles du type POSIX. De plus, une fonction de correspondance de modèles, substring, est disponible. Elle utilise soit le style SQL99 soit le style POSIX des expressions rationnelles.

Astuce : Si vous avez besoin des correspondances de modèles qui vont au delà de ça, considérez l'écriture d'une fonction en Perl ou Tcl.

9.6.1. LIKE

chaîne LIKE modèle
[ESCAPE caractère d'échappement]
chaîne NOT LIKE modèle
[ESCAPE caractère d'échappement]

Chaque modèle définit un ensemble de chaîne. L'expression LIKE renvoie true si la chaîne est contenu dans l'ensemble de chaînes représenté par le modèle. (Comme attendu, l'expression NOT LIKE renvoie false si LIKE renvoie true et vice versa. Une expression équivalente est NOT (chaîne LIKE modèle).)

Si le modèle ne contient pas de signe de pourcentage ou de tirets bas, alors le modèle représente seulement la chaîne elle-même ; dans ce cas, LIKE agit exactement comme l'opérateur d'égalité. Un tiret bas (_) dans modèle correspond à un seul caractère ; un signe de pourcentage (%) correspond à toutes les chaînes de zéro à plus de caractères.

Quelques exemples :

'abc' LIKE 'abc'    true
'abc' LIKE 'a%'     true
'abc' LIKE '_b_'    true
'abc' LIKE 'c'      false

Le modèle LIKE correspond toujours à la chaîne entière. Pour faire correspondre un modèle à l'intérieur d'une chaîne, le modèle doit donc commencer et finir avec un signe de pourcentage.

Pour faire correspondre un vrai tiret bas ou un vrai signe de pourcentage sans qu'ils remplacent d'autres caractères, le caractère correspondant dans modèle doit être précédé du caractère d'échappement. Par défaut, il s'agit de l'anti-slash mais un autre caractère peut être sélectionné en utilisant la clause ESCAPE. Pour correspondre au caractère d'échappement lui-même, écrivez deux fois ce caractère.

Notez que l'anti-slash a déjà une signification particulière dans les chaînes littérales, donc écrite une constante du modèle avec un anti-slash signifie écrire quatre anti-slash dans l'instruction. Vous pouvez éviter ceci en sélectionnant un autre caractère d'échappement avec ESCAPE ; ensuite un anti-slash n'est plus spécial dans un LIKE. (Mais il est toujours spécial dans l'analyseur de chaînes littérales, donc vous aurez besoin des deux.)

Il est aussi possible de ne sélectionner aucun caractère d'échappement en écrivant ESCAPE ''. Ceci désactive complètement le mécanisme d'échappement, ce qui rend impossible la désactivation de la signification particulière du tiret bas et du signe de pourcentage dans le modèle.

Le mot clé ILIKE est utilisé à la place de LIKE pour faire des correspondances sans tenir compte de la casse mais en tenant compte de la locale active. Ceci ne fait pas partie du standard SQL mais est une extension PostgreSQL.

L'opérateur ~~ est équivalent à LIKE alors que ~~* correspond à ILIKE. Il existe aussi les opérateurs !~~ et !~~* représentant respectivement NOT LIKE et NOT ILIKE. Tous ces opérateurs sont spécifiques à PostgreSQL.

9.6.2. Expressions rationnelles SIMILAR TO et SQL99

chaîne SIMILAR TO modèle
[ESCAPE caractère d'échappement]
chaîne NOT SIMILAR TO
modèle [ESCAPE
caractère d'échappement]

L'opérateur SIMILAR TO renvoie true ou false suivant le fait que son modèle corresponde ou non à la chaîne donnée. C'est identique à LIKE sauf qu'il interprète le modèle en utilisant la définition SQL99 d'une expression rationnelle. Les expressions rationnelles SQL99 sont un curieux mélange de la notation LIKE et de la notation habituelle des expressions rationnelles.

Comme LIKE, l'opérateur SIMILAR TO réussit uniquement si son modèle correspond à la chaîne entière ; ceci ne ressemble pas aux pratiques habituelles des expressions rationnelles où le modèle peut se situer n'importe où dans la chaîne. Ainsi comme LIKE, SIMILAR TO utilise _ et % comme caractères joker dénotant respectivement un caractère seul et toute chaîne (ils sont comparables à . and .* dans les expressions compatibles POSIX).

En plus de ces fonctionnalités empruntées à LIKE, SIMILAR TO supporte trois méta-caractères de correspondance de modèle empruntés aux expressions rationnelles de POSIX :

Notez que les répétitions (? and {...}) ne sont pas permises bien qu'elles existent en POSIX. De même, le point (.) n'est pas un méta-caractère.

Comme avec LIKE, un anti-slash désactive la signification spéciale de tous les méta-caractères ; un autre caractère d'échappement peut être spécifié avec ESCAPE.

Quelques exemples :

'abc' SIMILAR TO 'abc'      true
'abc' SIMILAR TO 'a'        false
'abc' SIMILAR TO '%(b|d)%'  true
'abc' SIMILAR TO '(b|c)%'   false

La fonction substring avec trois paramètres, substring(chaîne from modèle for caractère d'échappement), fournit une extraction qu'une sous-chaîne correspondant à un modèle d'expression rationnelle SQL99. Comme avec SIMILAR TO, le modèle spécifié doit correspondre à l'entière chaîne de données, sinon la fonction échouera et renverra NULL. Pour indiquer la partie du modèle qui devrait être renvoyée en cas de succès, le modèle doit contenir deux occurrences du caractères d'échappement suivi d'un guillemet double ("). Le texte correspondant à la portion du modèle entre ces deux marqueurs est renvoyé.

Quelques exemples :

substring('foobar' from '%#"o_b#"%' for '#')  
oob
substring('foobar' from '#"o_b#"%' for '#')   
NULL

9.6.3. Expressions rationnelles POSIX

Tableau 9-11 liste les opérateurs disponibles pour la correspondance de modèles en utilisant les expressions rationnelles POSIX.

Tableau 9-11. Opérateurs de correspondance des expressions rationnelles

OpérateurDescriptionExemple
~ Correspond à l'expression rationnelle, en tenant compte de la casse'thomas' ~ '.*thomas.*'
~* Correspond à l'expression rationnelle, sans tenir compte de la casse'thomas' ~* '.*Thomas.*'
!~ Ne correspond pas à l'expression rationnelle, en tenant compte de la casse'thomas' !~ '.*Thomas.*'
!~* Ne correspond pas à l'expression rationnelle, sans tenir compte de la casse'thomas' !~* '.*vadim.*'

Les expressions rationnelles POSIX fournissent un moyen plus puissant pour la correspondance de modèles par rapport aux opérateurs LIKE et SIMILAR TO. Beaucoup d'outils Unix comme egrep, sed ou awk utilise un langage de correspondance de modèles similaire à celui décrit ici.

Une expression rationnelle est une séquence de caractères qui est une définition abrégée d'un ensemble de chaînes (un ensemble rationnel). Une chaîne est dite correspondante à une expression rationnelle si elle est membre de l'ensemble rationnel décrit par l'expression rationnelle. Comme avec LIKE, les caractères modèles correspondent exactement aux caractères de chaîne sauf s'ils représentent des caractères spéciaux dans le langage des expressions rationnelles mais les expressions rationnelles utilisant des caractères spéciaux différents de ceux de LIKE. Contrairement aux modèles pour LIKE, une expression rationnelle est autorisée à correspondre quelque part dans la chaîne, sauf si l'expression rationnelle est explicitement ancrée au début ou à la fin de la chaîne.

Quelques exemples :

'abc' ~ 'abc'    true
'abc' ~ '^a'     true
'abc' ~ '(b|d)'  true
'abc' ~ '^(b|c)' false

La fonction substring avec deux paramètres, substring(chaîne from modèle), fournit une extraction d'une sous-chaîne correspondant à un modèle d'expression rationnelle POSIX. Il renvoie NULL s'il n'y a pas de correspondance et la portion de texte correspondant au modèle dans le cas contraire. Mais si le modèle contient des parenthèses, la portion de texte ayant correspondu à la première sous-expression entre parenthèses (la première dont la parenthèse gauche apparaît) est renvoyée. Vous pouvez toujours placer ces parenthèses entre l'expression complète si vous voulez utiliser des parenthèses à l'intérieur sans déclencher cette exception. Voir aussi les parenthèses sans capture décrites plus bas.

Quelques exemples :

substring('foobar' from 'o.b')     oob
substring('foobar' from 'o(.)b')   o

Les expressions rationnelles de PostgreSQL sont implémentées en utilisant un paquetage écrit par Henry Spencer. La plupart des descriptions d'expressions rationnelles ci-dessous sont copiés directement de sa page man.

9.6.3.1. Détails des expressions rationnelles

Les expressions rationnelles (ERs), ainsi qu'elles sont définies dans POSIX 1003.2, viennent en deux formats : les ER étendues ou ERE (en gros celles de egrep) et les ER élémentaires ou ERB (principalement celles d'ed). PostgreSQL supporte les deux formes et implémente aussi quelques extensions ne faisant pas partie du standard POSIX mais devenant malgré tout de plus en plus populaire à cause de leur disponibilité dans les langages de programmation tels que Perl et Tcl. Les ER utilisant ces extensions non POSIX sont appelées des ER avancées ou des ARE dans cette documentation. Les ARE sont un surensemble exact des ERE alors que les ERB ont des incompatibilités de notation (en dehors du fait qu'elles sont bien plus limitées). Nous décrivons tout d'abord les formats ARE et ERE, notant les fonctionnalités qui s'appliquent seulement aux ARE et puis nous décrivons la différence avec les ERB.

Note : La forme des expressions rationnelles acceptées par PostgreSQL peut être choisie en initialisant le paramètres à l'exécution regex_flavor (décrit dans Section 16.4). La configuration habituelle est advanced (NdT : pour avancées) mais il est possible de sélectionner extended (pour étendues) avec un maximum de compatibilité avec les versions antérieures à la 7.4 de PostgreSQL.

Une expression rationnelle est définie par une ou plusieurs branches branches séparées par des caractères |. Elle établit une correspondance avec tout ce qui correspond à une des branches.

Une branche contient des atomes quantifiés ou des contraintes, concaténés. Elle établit une correspondance pour le premier suivie d'une correspondance pour le second, etc ; une branche vide établit une correspondance avec une chaîne vide.

Un atome quantifié est un atome suivi le cas échéant d'un seul quantificateur. Sans quantificateur, il établit une correspondance avec l'atome. Avec un quantificateur, il peut établir autant de correspondances avec l'atome que possible. Un atome peut être toute possibilité montrée dans Tableau 9-12. Les quantifieurs possibles et leurs significations sont disponibles dans Tableau 9-13.

Une contrainte correspond à une chaîne vide mais correspond seulement si des conditions spécifiques sont rencontrées. Une contrainte peut être utilisée mais elle ne peut pas être suivie d'un quantificateur. Les contraintes simples sont affichées dans Tableau 9-14 ; quelques contraintes supplémentaires sont décrites après.

Tableau 9-12. Atomes d'expressions rationnelles

AtomeDescription
(re) (où re est toute expression rationnelle) établie une correspondance avec re, la correspondance étant conservée pour un rapport possible
(?:re) comme ci-dessus mais la correspondance n'est pas conservée (un ensemble de parenthèses << sans capture >>) (seulement ARE)
. correpond à tout caractère seul
[caractères] une expression entre crochets, correspondant à n'importe lequel des caractères (voir Section 9.6.3.2 pour plus de détails)
\k (où k est tout sauf un caractère alpha-numérique) établit une correspondance avec un caractère ordinaire, c'est-à-dire \\ correspond à un caractère anti-slash
\c c est un caractère alphanumérique (probablement suivi d'autres caractères) est un échappement, voir Section 9.6.3.3 (ARE seulement ; pour les ERE et ERB, ceci correspond à c)
{ lorsqu'il est suivi d'un caractère autre qu'un chiffre, établit une correspondance avec l'accolade ouvrante { ; si elle est suivie d'un chiffre, c'est le début d'une limite (voir ci-dessous)
x x est un simple caractère sans signification et correspondant donc à ce caractère

Une ER pourrait ne pas terminer avec \.

Note : Rappelez-vous que l'anti-slash (\) a déjà une signification particulière dans les chaînes littérales PostgreSQL. Pour écrire un modèle constant contenant un anti-slash, vous devez écrire deux anti-slashs dans l'instruction.

Tableau 9-13. Quantifiant d'expressions rationnelles

QuantifiantCorrespondance
* une séquence de 0 ou plus correspondance de l'atome
+ une séquence de 1 ou plus correspondance de l'atome
? une séquence 0 ou 1 correspondance de l'atome
{m} une séquence d'exactement m correspondance de l'atome
{m,} une séquence de m ou plus correspondance de l'atome
{m,n} une séquence de m à n (inclus) correspondance de l'atome ; m ne doit pas être supérieur à n
*? version non gourmande de *
+? version non gourmande de +
?? version non gourmande de ?
{m}? version non gourmande de {m}
{m,}? version non gourmande de {m,}
{m,n}? version non gourmande de {m,n}

Les formes utilisant {...} sont connues comme des limites. Les nombres m et n à l'intérieur d'une limite sont des entiers décimaux non signés avec des droits allant de 0 à 255 inclus.

Les quantificateurs non gourmands (disponibles uniquement avec les ERA) correspondent aux même possibilités que leur équivalent normal (gourmand) mais préfèrent le plus petit nombre plutôt que le plus grand nombre de correspondance. Voir Section 9.6.3.5 pour plus de détails.

Note : Un quantificateur ne peut pas immédiatement suivre un autre quantificateur. Un quantificateur ne peut pas commencer une expression ou une sous-expression ou suivre ^ ou |.

Tableau 9-14. Contraintes des expressions rationnelles

ContrainteDescription
^ correspond au début d'une chaîne
$ correspond à la fin d'une chaîne
(?=re) positive lookahead correspond à tout point où une sous-chaîne correspondant à re commence (uniquement pour les ERA)
(?!re) negative lookahead correspond à tout point où aucune sous-chaîne correspondant à re commence (uniquement pour les ERA)

Les contraintes << lookahead >> ne doivent pas contenir de références arrières (voir Section 9.6.3.3), et toutes les parenthèses contenues sont considérées comme non capturantes.

9.6.3.2. Expressions avec crochets

Une expression entre crochets est une liste de caractères contenus dans []. Cela correspond normalement à tout caractère de la liste (mais voir plus bas). Si la liste commence avec ^, cela correspond à tout caractère non compris dans la liste. Si deux caractères de la liste sont séparés par un tiret (-), c'est un raccourci pour tous les caractères compris entre ces deux, c'est-à-dire qu'en ASCII, [0-9] correspond à tout chiffre. Il est illégal d'avoir deux séquences partageant la même fin, par exemple a-c-e. Ces séquences dépendent grandement de la façon dont elles sont créées, les programmes portables devraient donc éviter leur utilisation.

Pour inclure un littéral ] dans la liste, faites en sorte qu'il soit le premier caractère (suivant un possible ^). Pour inclure un littéral -, faites en sorte qu'il soit le premier ou le dernier caractère, ou qu'il soit dans le deuxième point final d'une séquence. Pour utiliser un littéral - comme premier point final d'une séquence, englobez-le dans [. et .] pour en faire un élément de cohésion (voir ci-dessous). Avec l'exception de ces caractères, quelques combinaisons utilisant [ (voir les paragraphes suivants) et les échappements (uniquement pour les ERA), tous les autres caractères spéciaux perdent leur signification spéciale à l'intérieur d'une expression entre crochets. En particulier, \ n'est pas spécial lorsqu'il suit les règles des ERE ou des ERB bien qu'il soit spécial (en tant qu'introduction d'un échappement) dans les ERA.

À l'intérieur d'une expression entre crochets, un élément liant (un caractère, une séquence de caractères multiples qui se suivent comme s'il n'y avait qu'un seul caractère, ou le nom d'une séquence liée) englobé dans [. et .] correspond à une séquence de caractères de cet élément liant. La séquence est un simple élément de la liste de l'expression entre crochets. Une expression entre crochets contenant un élément liant avec plusieurs caractères peut donc correspondre à plus d'un caractère, c'est-à-dire que si la séquence liante inclut un élément liant ch, alors la ER [[.ch.]]*c établit une correspondance avec les cinq premiers caractères de chchcc.

Note : PostgreSQL n'a pas d'éléments multi-caractères qui se suivent. Cette information décrit les comportements futurs possibles.

À l'intérieur d'une expression entre crochets, un élément liant englobé dans [= et =] est une classe d'équivalence, correspondant aux séquences de caractères de tous les éléments liant équivalent à celui-là, lui-même étant compris. (S'il n'existe pas d'éléments liants correspondants, le traitement est comme si les délimiteurs englobant étaient [. et .].) Par exemple, si o et ^ sont les membres d'une classe d'équivalence, alors [[=o=]], [[=^=]] et [o^] sont tous synonymes. Une classe d'équivalence ne peut pas être le point final d'une séquence.

À l'intérieur d'une expression entre crochets, le nom d'une classe de caractères englobé dans [: et :] correspond à la liste de tous les caractères appartenant à cette classe. Les noms de classes de caractères standards sont alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit. Ils correspondent aux classes de caractère définies dans ctype. Une locale pourrait en fournir d'autres. Une classe de caractères pourrait ne pas être utilisée comme point final d'une séquence.

Il existe deux cas spéciaux d'expressions entre crochets : les expressions entre crochets [[:<:]] et [[:>:]] sont contraintes, correspondant à des chaînes vides respectivement au début et à la fin d'un mot. Un mot est défini comme une séquence de caractères qui n'est ni précédée ni suivie de caractères. Un caractère de mot est un caractère alnum (comme défini par ctype) ou un tiret bas. C'est une extension, compatible avec mais non spécifiée dans POSIX 1003.2, et devrait être utilisé avec précaution dans les logiciels conçus pour être portables sur d'autres systèmes. Les échappements de contraintes décrites ci-dessous sont généralement préférables (elles ne sont pas plus standard mais elles sont certainement plus simple à saisir).

9.6.3.3. Échappement d'expressions rationnelles

Les échappements sont des séquences spéciales commençant avec \ et suivies d'un caractère alphanumérique. Les échappements viennent en plusieurs variétés : entrée de caractère, raccourci de classe et références. Un \ suivi d'un caractère alphanumérique mais ne constituant pas un échappement valide est illégal dans une ERA. Pour les ERE, il n'y pas d'échappement : en dehors d'une expression entre crochets, un \ suivi d'un caractère alphanumérique signifie simplement ce caractère (ordinaire) et, à l'intérieur d'une expression entre crochets, \ est un caractère ordinaire. (ce dernier est la vraie incompatibilité entre les ERE et les ERA.)

Les échappements d'entrée de caractères existent pour faciliter la spécification de caractères non affichables ou indésirables pour toute autre raison dans les ER. Ils sont disponibles dans Tableau 9-15.

Les échappements de raccourci de classes fournissent des raccourcis pour des classes de caractères communément utilisées. Ils sont disponibles dans Tableau 9-16.

Un échappement à contrainte est une contrainte, correspondant à la chaîne vide si les conditions spécifiques sont rencontrées, écrite avec un échappement. Ils sont disponibles dans Tableau 9-17.

Une référence (\n) correspond à la même chaîne que la sous-expression précédente entre parenthèses spécifiée par le nombre n (voir Tableau 9-18). Par exemple, ([bc])\1 correspond à bb ou cc mais ni bc ni cb. La sous-expression doit complètement précédée la référence dans la ER. Les sous-expressions sont numérotées dans l'ordre des parenthèses ouvrantes. Les parenthèses non capturantes ne définissent pas de sous-expressions.

Note : Gardez à l'esprit qu'un symbole d'échappement \ devra être doublé si vous souhaitez le saisir comme une chaîne SQL constante.

Tableau 9-15. Échappements d'entrée de caractère des expressions rationnelles

ÉchappementDescription
\a caractère alerte (sonnerie), comme en C
\b effacement, comme en C
\B synonyme de \ pour aider à la réduction des doubles anti-slashs
\cX (où X est un caractère quelconque) le caractère dont les 5 bits de poids faible sont les mêmes que ceux de X et dont tous les autres bits sont à zéro
\e le caractère dont le nom de séquence liante est ESC ou, en dehors de ça, le caractère de valeur octale 033
\f retour chariot, comme en C
\n retour à la ligne, comme en C
\r retour à la ligne, comme en C
\t tabulation horizontale, comme en C
\uwxyz (où wxyz est exactement quatre chiffres hexadécimaux) le caractère Unicode U+wxyz dans l'ordre des octets locaux
\Ustuvwxyz (où stuvwxyz représentent exactement huit chiffres hexadécimaux) réservé pour une extension Unicode vers le 32 bits, un peu hypothétique
\v tabulation verticale, comme en C
\xhhh (où hhh est toute séquence de chiffres hexadécimaux) le caractère dont la valeur hexadécimale est 0xhhh (un simple caractère, peu importe le nombre de chiffres hexadécimaux utilisés)
\0 le caractère dont la valeur est 0
\xy (où xy représente exactement deux chiffres octaux et qui n'est pas une référence) le caractère dont la valeur octale est 0xy
\xyz (où xyz représente exactement trois chiffres octaux et qui n'est pas une référence) le caractère dont la valeur octale est 0xyz

Les chiffres hexadécimaux sont 0-9, a-f et A-F. Les chiffres octaux sont 0-7.

Les échappements d'entrée de caractères sont toujours pris comme des caractères ordinaires. Par exemple, \135 est ] en ASCII mais \135 ne termine pas une expression entre crochets.

Tableau 9-16. Échappement de raccourcis de classes des expressions rationnelles

ÉchappementDescription
\d [[:digit:]]
\s [[:space:]]
\w [[:alnum:]_] (notez que le tiret bas est inclus)
\D [^[:digit:]]
\S [^[:space:]]
\W [^[:alnum:]_] (notez que le tiret bas est inclus)

À l'intérieur d'expressions entre crochets, \d, \s, et \w perdent leurs crochets externes, et \D, \S et \W sont illégales. (Donc, par exemple, [a-c\d] est équivalent à [a-c[:digit:]]. De plus, [a-c\D], qui est équivalent à [a-c^[:digit:]], est illégal.)

Tableau 9-17. Échappements de contraintes des expressions rationnelles

ÉchappementDescription
\A correspond seulement au début de la chaîne (voir Section 9.6.3.5 pour comprendre comment ceci diffère de ^)
\m correspond seulement au début d'un mot
\M correspond seulement à la fin d'un mot
\y correspond seulement au début ou à la fin d'un mot
\Y correspond seulement à un point qui n'est ni le début ni la fin d'un mot
\Z correspond seulement à la fin d'une chaîne (voir Section 9.6.3.5 pour comprendre comment ceci diffère de $)

Un mot est défini suivant la spécification de [[:<:]] et [[:>:]] ci-dessus. Les contraintes d'échappements sont illégales à l'intérieur d'expressions entre crochets.

Tableau 9-18. Références dans les expressions rationnelles

ÉchappementDescription
\m (où m est un chiffre différent de zéro) une référence de la mème sous-expression
\mnn (où m est un chiffre différent de zéro et nn quelques chiffres supplémentaires et la valeur décimale mnn n'est pas plus grande que le nombre de parenthèses fermantes capturantes vues jusqu'à maintenant) une référence de la mnnème sous-expression

Note : Il existe une ambiguïté historique inhérente entre les échappements d'entrée de caractères en octal et les référencées, ambiguïté résolue par des heuristiques, comme montré ci-dessus. Un zéro en début indique toujours un échappement octal. Un seul caractère différent de zéro et suivi d'un autre caractère est toujours pris comme une référence. Une séquence à plusieurs chiffres ne commençant pas avec un zéro est pris comme une référence si une sous-expression convenable (c'est-à-dire que le nombre fait partie des numéros de référence). Dans le cas contraire, il est pris pour un nombre octal.

9.6.3.4. Métasyntaxe des expressions rationnelles

En plus de la syntaxe principale décrite ci-dessus, il existe quelques formes spéciales et autres possibilités syntaxiques disponibles.

Normalement, la recette de ER en cours d'utilisation est déterminé par regex_flavor. Néanmoins, cela peut être surchargé par un préfixe directeur. Si un ER, quelque soit son type, commence avec ***:, le reste de l'ER est considéré comme une ERA. Si un ER, quelque soit son type, commence avec ***=, le reste de l'ER est considéré comme une chaîne littérale, tous les caractères étant donc considérés ordinaires.

Une ERA pourrait commencer avec des options intégrées : une séquence (?xyz) (où xyz correspond à un ou plusieurs caractères alphabêtiques) spécifie les options affectant le reste de l'ER. Ces options surchargent toutes options précédemment déterminées (incluant le type de l'ER et la sensibilité à la casse). Les lettres d'options disponibles sont indiquées dans Tableau 9-19.

Tableau 9-19. Lettres d'option intégré à une ERA

OptionDescription
b le reste de l'ER est une ERB
c activation de la sensibilité à la casse (surcharge l'opérateur type)
e le reste de l'ER est une ERE
i désactivation de la sensibilité à la casse (voir Section 9.6.3.5) (surcharge l'opérateur type)
m synonyme historique pour n
n activation de la sensibilité aux nouvelles lignes (voir Section 9.6.3.5)
p activation partielle de la sensibilité aux nouvelles lignes (voir Section 9.6.3.5)
q le reste de l'ER est une chaîne littérale (<< entre guillemets >>), composé uniquement de caractères ordinaires
s désactivation de la sensibilité aux nouvelles lignes (par défaut)
t syntaxe légère (par défaut ; voir ci-dessous)
w désactivation de la sensibilité aux nouvelles lignes (<< étrange >>) correspondantes (voir Section 9.6.3.5)
x syntaxe étendue (voir ci-dessous)

Les options intégrées prennent effet au ) terminant la séquence. Elles sont disponibles seulement au début d'une ERA et pourraient ne plus être utilisées ensuite à l'intérieur de celle-ci.

En plus de la syntaxe habituelle d'une ER (légère), dans laquelle tous les caractères ont une signification, il existe une syntaxe étendue, disponible en signifiant l'option intégrée x. Avec la syntaxe étendue, les caractères d'espace blanc d'une ER sont ignorés comme le sont tous les caractères entre un # et la nouvelle ligne suivante (ou la fin de l'ER). Ceci permet le commentaire d'une ER complexe. Il existe trois exceptions à cette règle de base :

  • un caractère espace blanc # suivi d'un \ est retenu

  • un caractère espace blanc # à l'intérieur d'une expression entre crochets est retenu

  • un espace blanc et des commentaires sont illégaux à l'intérieur de symboles multi-caractères, comme les ERA (?: ou les ERB \(

Les caractères d'espace blanc en syntaxe étendue sont l'espace, la tabulation, le retour chariot et tout caractère appartenant à la classe de caractère space.

Enfin, dans une ARE, à l'extérieur des expressions entre crochets, la séquence (?#ttt) (où ttt est tout texte ne contenant pas )) est un commentaire totalement ignoré. De nouveau, cela n'est pas permis entre les caractères des symboles multi-caractères comme (?:. De tels commentaires sont plus un artéfact historique qu'une fonctionnalité utile et leur utilisation est obsolète ; utilisez plutôt la syntaxe étendue.

Aucune de ces extensions métasyntaxe n'est disponible si un directeur initial ***= a spécifié que la saisie de l'utilisateur doit être traité comme une chaîne littérale plutôt que comme une ER.

9.6.3.5. Règles de correspondance des expressions rationnelles

Dans l'hypothèse qu'une ER pourrait correspondre à plus d'une sous-chaîne d'une chaîne donnée, l'ER correspond à la première. De même, dans l'hypothèse que l'ER pourrait correspondre à plus d'une sous-chaîne commençant au même endroit, le choix est déterminé par sa préférence : soit la plus longue chaîne, soit la plus courte.

La plupart des atomes et toutes les contraintes n'ont pas de préférence. Une ER entre parenthèses a la même préférence (y compris un manque de préférence) que l'ER. Un atome quantifié avec un quantificateur {m} ou {m}? a la même préférence (y compris un manque de préférence) que l'atome lui-même. Un atome quantifié avec d'autres quantifieurs standards (incluant {m,n} avec m égal à n) préfère la correspondance la plus longue. Un atome quantifié avec d'autres quantifieurs (incluant {m,n}? avec m égal à n) préfère la correspondance la plus courte. Une branche a la même préférence que son premier atome quantifié qui a une préférence. Une ER constitué de deux branches ou plus connecté avec l'opérateur | préfère la correspondance la plus longue.

Sujet aux contraintes imposées par les règles de correspondance de l'ER complète, les sous-expressions correspondent aussi aux sous-chaînes les plus longues ou les plus courtes, en se basant sur leurs préférences, avec des sous-expressions commençant en premier dans l'ER prenant l'avantage sur ceux commençant après. Notez que les sous-expressions externes ont la priorité par rapport aux composants.

Les quantifieurs {1,1} et {1,1}? peuvent être utilisés pour forcer la préférence la plus longue ou la plus courte, respectivement, sur une sous-expression ou sur l'ER complète.

Les longueurs de correspondance sont mesurés en caractères, et non pas en éléments liants. Une chaîne vide est considérée comme plus grande que pas de correspondance du tout. Par exemple : bb* correspond aux trois caractères du milieu de abbbc ; (week|wee)(night|knights) correspond aux dix caractères de weeknights ; lorsque (.*).* correspond à abc, la sous-expression entre parenthèses correspond aux trois caractères ; et quand (a*)* correspond à bc, à la fois l'ER et la sous-expression entre parenthèses correspondent à une chaîne vide.

Si la correspondance ne tient pas compte de la casse, l'effet revient à ce que toutes les distinctions de casse aient disparu de l'alphabet. Quand un caractère alphabétique, existant en plusieurs cas, apparaît comme un caractère ordinaire en dehors d'une expression entre crochets, il est effectivement transformé en une expression entre crochets contenant les deux cas, c'est-à-dire que x devient [xX]. Quand il apparaît dans une expression entre crochets, toutes les transformations de casse sont ajoutées à l'expression entre crochets, c'est-à-dire que [x] devient [xX] et que [^x] devient [^xX].

Si la sensibilité aux retours chariots est spécifiée, . et les expressions entre crochets utilisant ne correspondront jamais au caractère de retour à la ligne (de façon à ce que les correspondances ne croisent jamais les retours chariots sauf si l'ER arrange ceci explicitement), et ^ et $ correspondront à la chaîne vide respectivement après et avant un retour chariot, en plus de correspondre respectivement au début et à la fin de la chaîne. Mais les échappements ERA \A and \Z continuent de correspondre seulement au début et à la fin de la chaîne.

Si la sensibilité partielle aux retours chariot est spécifiée, ceci affecte . et les expressions entre crochets comme avec la sensibilité aux retours chariot mais sans ^ et $.

Si la sensibilité partielle inverse aux retours chariot est spécifiée, ceci affecte ^ et $ comme avec la sensibilité aux retours chariot mais sans . et les sous-expressions. Ceci n'est pas très utile mais est fournie pour des raisons de symétrie.

9.6.3.6. Limites et compatibilité

Aucune limite particulière n'est imposée sur la longueur des ER dans cette implémentation. Néanmoins, les programmes souhaitant être particulièrement portables ne devraient pas employer d'ER de plus de 256 octets car l'implémentation POSIX peut refuser d'accepter de telles ER.

La seule fonctionnalité des ERA, incompatible avec les ERE POSIX, est que \ ne perd pas sa signification spéciale à l'intérieur des expressions entre crochets. Toutes les autres fonctionnalités ERA utilisent une syntaxe qui est illégale ou a des effets indéfinis ou non spécifiés dans les ERE POSIX ; la syntaxe *** des directeurs est en dehors de la syntaxe POSIX pour les ERB et les ERE.

Un grand nombre des extensions ERA sont empruntées de Perl mais certaines ont été modifiées pour les nettoyer et quelques extensions Perl ne sont pas présentes. Les incompatibilités incluent \b, \B, le manque de traitement spécial pour le retour à la ligne en fin de chaîne, l'ajout d'expressions entre crochets aux expressions affectées par les correspondance avec retour à la ligne, les restrictions sur les parenthèses et les références dans les contraintes, et la correspondance des chaînes suivant leur taille (au lieu de la première rencontrée).

Deux incompatibilités importantes existent entre les syntaxes ERA et ERE reconnues par les pré-versions 7.4 de PostgreSQL:

  • Dans les ERA, \ suivi d'un caractère alphanumérique est soit un échappement soit une erreur alors que dans les versions précédentes, c'était simplement un autre moyen d'écrire un caractère alphanumérique. Ceci ne devrait pas poser trop de problèmes car il n'existe aucune raison pour écrire une telle séquence dans les versions précédentes.

  • Dans les ERA, \ reste un caractère spécial y compris à l'intérieur de [], donc un \ littéral à l'intérieur d'une expression entre crochets doit être écrit \\.

Alors que ces différences ne devraient pas poser problèmes pour la plupart des applications, vous pouvez les éviter si nécessaire en initialisant regex_flavor à extended.

9.6.3.7. Expressions rationnelles élémentaires

Les ERB diffèrent des ERE sur plusieurs aspects. |, + et ? sont des caractères ordinaires et il n'existe pas d'équivalent pour leur fonctionnalité. Les délimiteurs sont \{ et \}, avec { et } étant eux-même des caractères ordinaires. Les parenthèses pour les sous-expressions imbriquées sont \( et \), avec ( et ) étant eux-mêmes des caractères ordinaires. ^ est un caractère ordinaire sauf au début d'une ER ou au début d'une sous-expression entre parenthèses, $ est un caractère ordinaire sauf à la fin d'une ER ou à la fin d'une sous-expression entre parenthèses et * est un caractère ordinaire s'il apparaît au début d'une ER ou au début d'une sous-expression entre parenthèses (après un possible ^). Enfin, les références à un seul chiffre sont disponibles, et \< et \> sont des synonymes pour respectivement [[:<:]] et [[:>:]] ; aucun autre échappement n'est disponible.