PostgreSQLLa base de données la plus sophistiquée au monde.

9.7. Correspondance de modèles

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

[Astuce]

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.7.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 contenue 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 tiret 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 une séquence à 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'antislash 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'antislash a déjà une signification particulière dans les chaînes littérales, donc écrire une constante du modèle avec un antislash signifie écrire quatre antislashs dans l'instruction. Vous pouvez éviter ceci en sélectionnant un autre caractère d'échappement avec ESCAPE ; ensuite un antislash 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.7.2. Expressions rationnelles SIMILAR TO

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 SQL d'une expression rationnelle. Les expressions rationnelles SQL 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 à . et .* 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 :

  • | dénote une alternative (une des deux alternatives).

  • * dénote la répétition des éléments précédents, entre zéro et un nombre illimité de fois.

  • + dénote la répétition des éléments précédents, entre une et un nombre illimité de fois.

  • Les parenthèses () peuvent être utilisées pour grouper des éléments en un seul élément logique.

  • Une expression entre crochets [...] spécifie une classe de caractères, comme dans les expressions rationnelles 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 antislash 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 l'extraction d'une sous-chaîne correspondant à un modèle d'expression rationnelle SQL. Comme avec SIMILAR TO, le modèle spécifié doit correspondre à la chaîne de données entière, 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.7.3. Expressions rationnelles POSIX

Le Tableau 9.11, « Opérateurs de correspondance des expressions rationnelles » 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érateur Description Exemple
~ 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 utilisent un langage de correspondance de modèles similaire à celui décrit ici.

Une expression rationnelle est une séquence de caractères représentant 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. Elle renvoie NULL s'il n'y a pas de correspondance et elle renvoie 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 placer ces parenthèses entre l'expression complète si vous voulez utiliser des parenthèses à l'intérieur sans déclencher cette exception. Si vous avez besoin des parenthèses dans le modèle avant la sous-expression que vous voulez extraire, voir les parenthèses sans capture décrites plus bas.

Quelques exemples :

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

La fonction regexp_replace fournit la substitution d'un nouveau texte pour les sous-chaînes correspondant aux modèles d'expressions rationnelles. Il a la syntaxe regexp_replace(source, modèle, remplacement [, options ]). La chaîne source est renvoyée non modifiée s'il n'existe pas de correspondance au modèle. S'il existe une correspondance, la chaîne source est renvoyée avec la chaîne remplacement substituée pour la sous-chaîne correspondante. La chaîne remplacement peut contenir \n, où n vaut de 1 à 9, indiquant que la n-ième sous-chaîne source correspondante devra être insérée. Elle peut aussi contenir \& pour indiquer que la sous-chaîne correspondant au modèle entier devra être insérée. Ecrivez \\ si vous avez besoin de placer un antislash littéral dans le texte de remplacement (comme toujours, rappelez-vous de doubler les antislashs dans les chaînes littérales constantes). Le paramètre options est une chaîne optionnelle contenant zéro ou plusieurs options, une letter par option, permettant de modifier le comportement de la fonction. L'option i signifie ue recherche insensible à la casse alors que l'option g demande un remplacement de chaque sous-chaîne correspondante (et non pas seulement la première).

Quelques exemples :

regexp_replace('foobarbaz', 'b..', 'X')
                                   fooXbaz
regexp_replace('foobarbaz', 'b..', 'X', 'g')
                                   fooXX
regexp_replace('foobarbaz', 'b(..)', 'X\\1Y', 'g')
                                   fooXarYXazY

Les expressions rationnelles de PostgreSQL™ sont codées à l'aide d'un paquetage écrit par Henry Spencer. La plupart des descriptions d'expressions rationnelles ci-dessous sont copiées directement de sa page man.

9.7.3.1. Détails des expressions rationnelles

Les expressions rationnelles (ER), 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 basiques 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 grâce à 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 ERA dans cette documentation. Les ERA sont un surensemble exact des ERE alors que les ERB ont des incompatibilités de notation (sauf parler du fait qu'elles sont bien plus limitées). Nous décrivons tout d'abord les formats ERA et ERE, notant les fonctionnalités qui s'appliquent seulement aux ERA et puis nous décrivons la différence avec les ERB.

[Note]

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 le Chapitre 17, Configuration du serveur). La configuration habituelle est advanced (NdT : pour avancées) mais il est possible de sélectionner extended (pour étendues) pour obtenir 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 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 suivi 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 quantifieur. Sans quantifieur, il établit une correspondance avec l'atome. Avec un quantifieur, il peut établir autant de correspondances avec l'atome que possible. Un atome peut être toute possibilité montrée dans le Tableau 9.12, « Atomes d'expressions rationnelles ». Les quantifieurs possibles et leurs significations sont disponibles dans le Tableau 9.13, « quantifieur d'expressions rationnelles ».

Une contrainte correspond à une chaîne vide mais correspond seulement si des conditions spécifiques sont rencontrées. Une contrainte peut être utilisée sauf qu'elle ne peut pas être suivie d'un quantificateur. Les contraintes simples sont affichées dans le Tableau 9.14, « Contraintes des expressions rationnelles » ; quelques contraintes supplémentaires sont décrites après.

Tableau 9.12. Atomes d'expressions rationnelles

Atome Description
(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 pour les ERA)
. correpond à tout caractère seul
[caractères] une expression entre crochets, correspondant à n'importe lequel des caractères (voir la Section 9.7.3.2, « Expressions avec crochets » pour plus de détails)
\k (où k est tout sauf un caractère alpha-numérique) établit une correspondance avec ce caractère, c'est-à-dire \\ correspond à un caractère antislash
\c c est un caractère alphanumérique (probablement suivi d'autres caractères) ; est un échappement, voirla Section 9.7.3.3, « Échappement d'expressions rationnelles » (ERA 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 établie une correspondance avec ce caractère

Une ER ne peut pas terminer avec \.

[Note]

Note

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

Tableau 9.13. quantifieur d'expressions rationnelles

quantifieur Correspondance
* 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 connus comme des limites. Les nombres m et n à l'intérieur d'une limite sont des entiers décimaux non signés dont les valeurs vont de 0 à 255 inclus.

Les quantifieurs 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 la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles » pour plus de détails.

[Note]

Note

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

Tableau 9.14. Contraintes des expressions rationnelles

Contrainte Description
^ 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 la Section 9.7.3.3, « Échappement d'expressions rationnelles »), et toutes les parenthèses contenues sont considérées comme non capturantes.

9.7.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). À l'exception de ces caractères, des combinaisons utilisant [ (voir les paragraphes suivants) et des é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 l'ER [[.ch.]]*c établit une correspondance avec les cinq premiers caractères de chchcc.

[Note]

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(3). 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(3)) ou un tiret bas. C'est une extension, compatible avec mais non spécifiée dans POSIX 1003.2, et devant être utilisée 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 simples à saisir).

9.7.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 d'échappement de contraintes 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ère 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 le Tableau 9.15, « Échappements d'entrée de caractère des expressions rationnelles ».

Les échappements de raccourci de classe fournissent des raccourcis pour des classes de caractères communément utilisées. Ils sont disponibles dans le Tableau 9.16, « Échappement de raccourcis de classes des expressions rationnelles ».

Un échappement à contrainte est une contrainte, correspondant à la chaîne vide si les conditions spécifiques sont rencontrées et écrites avec un échappement. Ils sont disponibles dans le Tableau 9.17, « Échappements de contraintes des expressions rationnelles ».

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 le Tableau 9.18, « Références dans les expressions rationnelles »). 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 l'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]

Note

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

'123' ~ '^\\d{3}' true

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

Échappement Description
\a caractère alerte (sonnerie), comme en C
\b effacement, comme en C
\B synonyme de \ pour aider à la réduction des doubles antislashs
\cX (où X est un caractère quelconque) le caractère dont les cinq 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 UTF16 (Unicode, 16 bits) 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

Échappement Description
\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 leur crochet externe, et \D, \S et \W sont illégals (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

Échappement Description
\A correspond seulement au début de la chaîne (voir la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles » 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 la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles » 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

Échappement Description
\m (où m est un chiffre différent de zéro) une référence de la m-iè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-ième sous-expression

[Note]

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 elle vient après 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.7.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, le type d'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 commence avec ***:, le reste de l'ER est considéré comme une ERA, quelque soit regex_flavor. Si un ER 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 peut 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 les 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 le Tableau 9.19, « Lettres d'option intégrées à une ERA ».

Tableau 9.19. Lettres d'option intégrées à une ERA

Option Description
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 la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles ») (surcharge l'opérateur type)
m synonyme historique pour n
n activation de la sensibilité aux nouvelles lignes (voir la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles »)
p activation partielle de la sensibilité aux nouvelles lignes (voir la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles »)
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 la Section 9.7.3.5, « Règles de correspondance des expressions rationnelles »)
x syntaxe étendue (voir ci-dessous)

Les options intégrées prennent effet au ) terminant la séquence. Elles pourraient seulement apparaître au début d'une ERA (après le directeur ***: s'il y en a un).

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 ne peuvent pas apparaître à l'intérieur de symboles multi-caractères, tels que (?:

Dans ce cas, les caractères d'espace blanc sont l'espace, la tabulation, le retour chariot et tout caractère appartenant à la classe de caractère space.

Enfin, dans une ERA, à 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.7.3.5. Règles de correspondance des expressions rationnelles

Dans l'hypothèse où une ER correspond à 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, soit la correspondance la plus longue possible soit la correspondance la plus courte possible sera prise suivant si l'ER est gourmande ou non-gourmande.

Le fait qu'une ER est gourmande ou non est déterminé par les règles suivantes :

  • La plupart des atomes, et toutes les contraintes, n'ont pas d'attribut de gourmandise (parce qu'ils ne correspondent pas à des quantités variables de texte de toute façon).

  • Ajouter des parenthèses autour d'une ER ne change pas sa gourmandise.

  • Un atome quantifié avec un quantificateur à répétition fixe ({m} ou {m}?) a la même gourmandise (peut-être aucune) que l'atome lui-même.

  • Un atome quantifié avec d'autres quantifieurs standards (incluant {m,n} avec m égal à n) est gourmand (préfère la plus grande correspondance).

  • Un atome quantifié avec un quantificateur non gourmand (incluant {m,n}? avec m égal à n) n'est pas gourmand (préfère la plus courte correspondance).

  • Une branche -- c'est-à-dire une ER qui n'a pas d'opérateur | de haut niveau -- est aussi gourmand que le premier atome quantifié en son sein qui a un attribut de gourmandise.

  • Une ER consistant en deux branches, ou plus, connectées par l'opérateur | est toujours gourmande.

Les règles ci-dessus associent les attributs de gourmandise non seulement avec les atomes quantifiés individuels, mais aussi avec les branches et les ER entiers contenant des atomes quantifiés. Cela signifie que la correspondance est faite d'une telle façon que la branche, ou l'ER complète, correspond à la sous-chaîne la plus longue ou la plus courte possible comme un tout. Une fois la longueur de la correspondance entière déterminée, la partie en lui qui correspond à toute sous-expression particulière est déterminée sur la base de l'attribut de gourmandise de cette sous-expression, avec les sous-expressions commençant plus tôt dans l'ER ayant priorité sur celles commençant après.

Un exemple de ce que cela signifie :

SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
Result: 123
SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
Result: 1

Dans le premier cas, l'ER est gourmand en un tout parce que Y* est gourmand. Elle peut correspondre au début de Y et cela correspond à la chaîne la plus longue commençant à partir de là, donc Y123. La sortie est la partie entre parenthèses, soit 123. Dans le second cas, l'ER en un tout n'est pas gourmand car Y*? ne l'est pas non plus. Cela peut correspondre au début de Y et cela correspond à la chaîne la plus courte commençant là, donc Y1. La sous-expression [0-9]{1,3} est gourmande mais cela ne peut pas changer la décision sur la longueur totale de la correspondance ; donc, cela le force à correspondre à seulement 1.

En bref, quand une ER contient à la fois des sous-expressions gourmandes et non gourmandes, la longueur de la correspondance totale est soit aussi longue que possible soit aussi courte que possible, suivant l'attribut affecté à l'ER complète. Les attributs affectés aux sous-expressions affectent seulement quelles parties de cette correspondance ils sont autorisés à « manger ».

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.7.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.7.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.