• Aucun résultat trouvé

5. Schémas XML

5.15. Expressions rationnelles

Une expression rationnelle désigne un ensemble de chaînes de caractères. Une chaîne donnée est conforme à une expression si elle fait partie des chaînes décrites. Les expressions rationnelles sont construites à partir des caractères et des opérateurs d'union '|', de concaténation et de répétition '?', '*' et '+'.

La syntaxe des expressions rationnelles des schémas est inspirée de celle du langage Perl avec cependant quelques variations. Elle diffère de la syntaxe utilisée par les DTD pour décrire les contenus purs d'éléments [Section 3.6.1] car la concaténation n'est plus marquée par la virgule ','. Ces expressions rationnelles sont utilisées par la facette xsd:pattern [Section 5.9.1.3] pour définir des restrictions de types simples. Elles sont également utilisées, en dehors des schémas, par les fonctions XPath matches(), replace() et tokenize() [Section 6.3.3] ainsi que l'élément XSLT xsl:analyze-string [Section 8.14].

La plupart des caractères se désignent eux-mêmes dans une expression. Ceci signifie que l'expression 'a' (sans les apostrophes) désigne l'ensemble réduit à l'unique chaîne 'a' (sans les apostrophes). Certains caractères, dits

spéciaux, ont une signification particulière dans les expressions. La liste des caractères spéciaux comprend les

caractères '|', '?', '*', '+', '.', '\', '(', ')', '[', ']', '{', '}'. Pour supprimer le caractère spécial d'un de ces caractères et l'inclure dans une expression, il faut le faire précéder du caractère d'échappement '\'. Quelques caractères d'espacement [Section 2.2.2] bénéficient de notations spécifiques. La tabulation U+09, le saut de ligne U+0A et le retour chariot U+0D peuvent être désignés par '\t', '\n' et '\r'. Ces notations ne sont pas indispensables puisque ces trois caractères peuvent être insérés dans un document XML avec la notation &#....

5.15.1. Opérateurs

Les principaux opérateurs des expressions rationnelles sont l'union désignée par le caractère '|', la concaténation notée par simple juxtaposition et les opérateurs de répétition '?', '*', '+'. Comme pour les expressions arithmétiques, on peut utiliser les parenthèses '(' et ')' pour former des groupes. Une expression de la forme

expr-1|expr-2 désigne l'union des ensembles de chaînes désignés par expr-1 et expr-2. L'expression a|

b désigne, par exemple, l'ensemble contenant les deux chaînes 'a' et 'b' (sans les apostrophes). Une expression de la forme expr-1expr-2 désigne l'ensemble des chaînes obtenues en concaténant (c'est-à-dire en mettant bout à bout) une chaîne conforme à l'expression expr-1 et une chaîne conforme à l'expression expr-2. L'expression ab désigne, par exemple, l'ensemble contenant l'unique chaîne ab. Il est, bien sûr, possible de combiner ces opérateurs. L'expression aba|ba désigne, par exemple, l'ensemble formé des deux chaînes aba et ba. L'expression a(a|b)bc désigne l'ensemble contenant les deux chaînes aabc et abbc.

5.15.2. Répétitions

Les opérateurs '?', '*', '+' permettent de répéter des groupes. Ils utilisent une notation postfixée : ils se placent après leur opérande. S'ils sont placés après un caractère, ils s'appliquent uniquement à celui-ci mais s'ils sont placés après un groupe entre parenthèses, ils s'appliquent à tout le groupe. Ils autorisent, respectivement, la répétition de leur opérande, zéro ou une fois, un nombre quelconque de fois et un nombre positif de fois. Une expression de la forme

expr? désigne l'ensemble constitué de la chaîne vide et des chaînes conformes à l'expression expr. Une expression

de la forme expr* désigne l'ensemble constitué de toutes les chaînes obtenues en concaténant plusieurs (éventuellement zéro) chaînes conformes à l'expression expr. L'expression a? désigne, par exemple, l'ensemble formé de la chaîne vide et de la chaîne 'a'. Les expressions a* et (a|b)* désignent, respectivement, les ensembles constitués des chaînes formées uniquement de 'a' et les chaînes formées de 'a' et de 'b'.

Schémas XML

Les accolades '{' et '}' permettent d'exprimer des répétitions dont le nombre est, soit un entier fixé, soit dans un intervalle donné. Une expression de la forme expr{n}, où n est un entier, désigne l'ensemble constitué de toutes les chaînes obtenues en concaténant exactement n chaînes conformes à l'expression expr. Une expression de la forme

expr{m,n}, où m et n sont des entiers, désigne l'ensemble constitué de toutes les chaînes obtenues en concaténant

un nombre de chaînes conformes à l'expression expr compris, au sens large, entre m et n. L'entier n peut être omis pour donner une expression de la forme expr{m,}. Le nombre de répétitions doit seulement être supérieur à m. L'expression (a|b){6} désigne, par exemple, les chaînes de longueur 6 formées de 'a' et de 'b'. L'expression (a|b){3,8} désigne les chaînes de longueur comprise entre 3 et 8 formées de 'a' et de 'b'.

5.15.3. Ensembles de caractères

Il est souvent nécessaire de désigner des ensembles de caractères pour construire des expressions rationnelles. Il existe plusieurs façons de décrire ces ensembles.

Le caractère spécial '.' désigne tout caractère autre qu'un retour à la ligne. L'expression a.b désigne, par exemple, l'ensemble de toutes les chaînes de trois caractères dont le premier est 'a', le second n'est pas un retour à la ligne et le dernier est 'b'. L'expression .* désigne l'ensemble de toutes les chaînes ne contenant aucun retour à la ligne.

Un ensemble fini de caractères peut simplement être décrit en donnant ces caractères encadrés par des crochets '[' et ']'. L'expression [aeiouy] désigne l'ensemble des voyelles minuscules et elle est équivalente à l'expression a|e|i|o|u|y. Cette syntaxe est pratique car elle permet d'inclure facilement un intervalle en plaçant un tiret '-' entre les deux caractères qui le délimitent. L'expression [0-9] désigne, par exemple, l'ensemble des chiffres. Il est possible de mettre des caractères et plusieurs intervalles. L'expression [:a-zA-F] désigne l'ensemble des lettres minuscules et majuscules et du caractère ':'. L'ordre des caractères entre les crochets est sans importance. Pour inclure un tiret '-' dans l'ensemble, il faut le placer en premier ou en dernier. Pour inclure un crochet fermant ']', il faut le placer en premier, juste après le crochet ouvrant. L'expression [- az] désigne l'ensemble des trois caractères '-', 'a' et'z'.

Lorsque le premier caractère après le crochet ouvrant est le caractère '^', l'expression désigne le complémentaire de l'ensemble qui aurait été décrit sans le caractère '^'. L'expression [^0-9] désigne, par exemple, l'ensemble des caractères qui ne sont pas un chiffre. Pour inclure un caractère '^' dans l'ensemble, il faut le placer à une autre place que juste après le crochet ouvrant. L'expression [0-9^] désigne, par exemple, l'ensemble formé des chiffres et du caractère '^'.

Un ensemble de caractères peut être décrit comme la différence de deux ensembles entre crochets. La syntaxe prend la forme [...-[...]] où ... est remplacé par une suite de caractères et d'intervalles comme dans les exemples précédents. L'expression [a-z-[aeiouy]] désigne, par exemple, l'ensemble des consonnes minuscules.

Certains ensembles de caractères fréquemment utilisés peuvent être décrits par le caractère d'échappement '\' suivi d'une lettre. Les différentes combinaisons possibles sont données ci-dessous.

\s

caractères d'espacement [Section 2.2.2], c'est-à-dire l'ensemble [ \t\n\r] \S

caractères autres que les caractères d'espacement, c'est-à-dire l'ensemble [^ \t\n\r] \d

chiffres, c'est-à-dire [0-9] \D

caractères autres que les chiffres, c'est-à-dire [^0-9] \w

Schémas XML

caractères alphanumériques et le tiret '-', c'est-à-dire [-0-9a-zA-Z]

caractères autres que les caractères alphanumériques et le tiret, c'est-à-dire [^-0-9a-zA-Z]

premiers caractères des noms XML [Section 2.2.3], c'est-à-dire [:_a-zA-Z]

caractères autres que les premiers caractères des noms XML, c'est-à-dire [^:_a-zA-Z]

caractères des noms XML [Section 2.2.3], c'est-à-dire [-.:_0-9a-zA-Z]

caractère autres que les caractères des noms XML, c'est-à-dire [^-.:_0-9a-zA-Z]

L'expression \s*\d+\s* désigne, par exemple, une suite non vide de chiffres encadrée, éventuellement, par des caractères d'espacement. L'expression \i\c* désigne l'ensemble des noms XML.

Il est aussi possible de décrire un ensemble de caractères en utilisant une des catégories de caractères Unicode. La syntaxe prend la forme \p{çat} pour l'ensemble des caractères de la catégorie çat et \P{çat} pour son complémentaire. L'expression \p{Lu} désigne, par exemple, toutes les lettres majuscules. Les principales catégories de caractères Unicode sont les suivantes.

Catégorie Signification L lettres Lu lettres majuscules Ll lettres minuscules N chiffres P caractère de ponctuation Z Séparateurs

Tableau 5.1. Catégories Unicode

\ W

\ i

\ I

\ c

Documents relatifs