Classes de caractères
Un crochet ouvrant [
introduit une classe de
caractères, et le crochet fermant ]
la
conclut. Le crochet fermant n'a pas de signification en lui-même.
Si le crochet fermant est nécessaire à l'intérieur
d'une classe de caractères, il faut qu'il soit le premier
caractère (après un ^
éventuel)
ou protégé avec un antislash.
Une classe de caractères remplace un seul caractère
dans la chaîne sujet, à moins que le premier
caractère de la classe soit un accent circonflexe
^
, qui représente une négation :
le caractère ne doit pas se trouver dans la classe. Si
^
est nécessaire dans la classe, il
suffit qu'il ne soit pas le premier caractère, ou bien
qu'il soit protégé par un antislash.
Par exemple, le caractère [aeiou]
remplace
n'importe quelle voyelle minuscule, tandis que [^aeiou]
remplace n'importe quel caractère qui n'est pas une voyelle
minuscule. ^
est une notation pratique pour
spécifier des caractères qui sont dans une classe,
en ne citant que ceux qui n'y sont pas. Le comportement est inchangé.
Avec l'option d'insensibilité à la casse, toutes les lettres
d'une classe de caractères représentent en même temps
la majuscule et la minuscule. Par exemple, [aeiou]
représentera "A
" ou "a
", et
[^aeiou]
n'acceptera pas "A
",
tandis que sans l'option, elle l'accepterait.
Le caractère de nouvelle ligne n'est pas traité de
manière spéciale dans les classes de caractères,
quelque soit l'option PCRE_DOTALL
ou PCRE_MULTILINE. Une classe
telle que [^a]
acceptera toujours une nouvelle ligne.
Le signe moins (-
) est utilisé pour
spécifier un intervalle de caractères, dans
une classe. Par exemple, [d-m]
remplace toutes
les lettres entre d et m inclus. Si le caractère moins est
requis dans une classe, il faut le protéger avec un antislash,
ou le faire apparaître à une position où il ne pourra
pas être interprété comme une indication d'intervalle,
c'est-à-dire au début ou à la fin de la classe.
Il n'est pas possible d'avoir le caractère crochet fermant
"]
" comme fin d'intervalle. Un masque tel que
[W-]46]
est compris comme la classe de caractères
contenant deux caractères ("W" et "-") suivie de la chaîne
littérale "46]", ce qui fait qu'il va accepter
"W46]
" ou "-46]
". Cependant, si
"]
" est protégé avec un antislash, le
masque [W-\]46]
est interprété comme
une classe d'un seul caractère, contenant un intervalle de
caractères. La valeur octale ou hexadécimale de
"]
" peut aussi être utilisée pour déterminer
les limites de l'intervalle.
Les intervalles travaillent sur des séquences ASCII.
Ils peuvent aussi être précisés avec des valeurs numériques :
par exemple "[\000-\037]
".
Si cet intervalle inclut des lettres utilisées avec une
option d'insensibilité de casse, les majuscules ou minuscules
correspondantes seront aussi incluses. Par exemple,
"[W-c]
" est équivalent à
"[][\^_`wxyzabc]
", avec l'option
d'insensibilité de casse. Si la table locale de
caractères est "fr", "[\xc8-\xcb]
"
correspond aux caractères accentués.
Les types de caractères \d
,
\D
, \S
, \s
,
\w
, \W
peuvent aussi intervenir
dans les classes de caractères. Par exemple,
"[][\^_`wxyzabc][\dABCDEF]
" acceptera n'importe
quel caractère hexadécimal. Un accent circonflexe peut
aussi être utilisé pour spécifier adroitement
des ensembles de caractères plus restrictifs : par exemple
[^\W_]
accepte toutes les lettres et les chiffres,
mais pas les soulignés.
Tous les caractères non alphanumériques autres que
\, -, ^
(placés en début de chaîne)
et ]
n'ont pas de signification
particulière, mais ils ne perdront rien à être protégés.
Le délimiteur de motif est toujours spécial, et doit être
protégé lorsqu'il est utilisé à l'intérieur d'une expression.
Perl supporte la notation POSIX pour les classes de caractères.
Elles utilisent des noms entourés par [:
et
:]
. PCRE supporte également cette notation. Par exemple,
[01[:alpha:]%]
trouve "0", "1", toute lettre,
ou encore le caractère "%". Les noms de classe supportés sont :
Classes de caractères
alnum |
lettres et chiffres |
alpha |
lettres |
ascii |
codes caractères 0 - 127 |
blank |
espace ou tabulation uniquement |
cntrl |
caractères de contrôle |
digit |
chiffres décimaux (identique à \d) |
graph |
caractères d'impression, excluant les espaces |
lower |
lettres en minuscule |
print |
caractères d'impression, incluant les espaces |
punct |
caractères d'impression, excluant les lettres et les chiffres |
space |
espace blanc (pas tout à fait identique à \s) |
upper |
lettres en majuscule |
word |
caractères composant un mot (identique à \w) |
xdigit |
chiffres hexadécimaux |
Les caractères d'espacement (
space
) sont HT (9), LF (10), VT (11), FF (12), CR (13),
et l'espace (32). Notez que cette liste inclut le caractère VT (code 11). Ceci rend la classe
"space" différente de
\s
, qui n'inclut pas ce caractère VT (pour une raison de compatibilité
Perl).
La classe word
est une extension Perl, et blank
est une extension GNU de Perl 5.8. La négation est une autre extension Perl ; elle est indiquée
par le caractère ^
après un double-point. Par exemple,
[12[:^digit:]]
trouve "1", "2", mais aussi tout caractère qui n'est pas un chiffre.
En mode UTF-8, les caractères dont les valeurs sont supérieures à 128 ne seront trouvés par
aucune des classes de caractères POSIX.
À partir de libpcre 8.10 certains caractères de classes ont été
modifié pour utiliser des caractères de propriétés Unicode, dans ce cas les
restrictions mentionnées ne s'applique pas.
Référez-vous au » manuel PCRE(3) pour plus de détails.
Les propriétés des caractères Unicode peuvent apparaitre à l'intérieur d'une
classe de caractère. Ils ne peuvent pas faire partie d'une étendue.
Le caractère moins (tiret) après une classe de caractère Unicode satisfera littéralement.
Essayer de terminer une étendue avec une propriété de caractère Unicode résultera en un avertissement.