Les classes de caractères
Les classes de caractères vont nous permettre de fournir différents choix de correspondance pour un caractère en spécifiant un ensemble de caractères qui vont pouvoir être trouvés.
En d’autres termes, elles vont nous permettre de rechercher n’importe quel caractère d’une chaine qui fait partie de la classe de caractères fournie dans le masque, ce qui va rendre les expressions régulières déjà beaucoup plus puissantes et flexibles qu’une recherche classique.
Pour déclarer une classe de caractères dans notre masque, nous allons utiliser une paire de crochets [ ]
qui vont nous permettre de délimiter la classe en question.
Prenons immédiatement un exemple concret en utilisant des classes de caractères simples :
See the Pen
Cours JavaScript 9.3.1 by Pierre (@pierregiraud)
on CodePen.
Notre premier masque est très simple : il contient uniquement la classe de caractères [aeiouy]
et l’option g
qui indique qu’on souhaite effectuer une recherche globale.
La classe de caractères [aeiouy]
va trouver n’importe quelle voyelle minuscule dans une chaine. Ici, on utilise nos masques avec la méthode match()
qui renvoie un tableau contenant les différentes correspondances trouvées entre la chaine de caractères donnée et le masque fourni.
Notre deuxième masque permet de chercher la séquence « un j suivi d’un voyelle ». En effet, ici, on place le caractère « j » en dehors de notre classe de caractères. Ce masque va donc nous permettre de chercher des séquences de deux caractères dont le premier est un « j » et le deuxième fait partie de la classe [aeiouy]
, c’est-à-dire les séquences « ja », « je », « ji », « jo », « ju » et « jy ».
Dans notre troisième masque, nous utilisons cette fois-ci deux classes de caractères d’affilée. Ici, les deux classes de caractères sont identiques (on aurait tout-à-fait pu spécifier deux classes de caractères différentes) et vont toutes les deux nous permettre de rechercher une voyelle. Ce masque permet donc de rechercher une séquence de deux voyelles, c’est-à-dire une voyelle suivie d’une autre voyelle.
Ici, vous pouvez déjà vous rendre compte à quel point les expressions régulières vont s’avérer puissantes et pratiques car on va pouvoir chercher plusieurs séquences de caractères différentes avec un seul masque.
Les classes de caractères et les méta caractères
Dans le langage des expressions régulières, de nombreux caractères vont avoir une signification spéciale et vont nous permettre de signifier qu’on recherche tel caractères ou telle séquence de caractères un certain nombre de fois ou à une certaine place dans une chaine.
On appelle ces caractères qui possèdent une signification des métacaractères. Ceux-ci vont nous permettre de créer des masques complexes et donc des schémas de recherche puissants. Le premier exemple de métacaractères qu’on a pu voir est tout simplement les caractères [
et ]
qui, ensemble, servent à délimiter une classe de caractères.
Il existe de nombreux métacaractères qu’on va pouvoir inclure dans nos masques. Cependant, au sein des classes de caractères, la plupart de ces métacaractères perdent leur signification spéciale. Il faudra donc toujours faire bien attention à bien distinguer les sens de ces caractères selon qu’ils sont dans une classe de caractères ou pas.
Au sein des classes de caractères, seuls les caractères suivants possèdent une signification spéciale et peuvent donc être considérés comme des méta caractères :
Métacaractère | Description |
---|---|
\ | Caractère de protection ou d’échappement qui va avoir plusieurs usages (on va pouvoir s’en servir pour donner un sens spécial à des caractères qui n’en possèdent pas ou au contraire pour neutraliser le sens spécial des métacaractères). |
^ | Si placé au tout début d’une classe, permet de nier la classe c’est-à-dire de chercher tout caractère qui n’appartient pas à la classe. |
– | Entre deux caractères, permet d’indiquer un intervalle de caractères (correspond à écrire les deux caractères et tous les caractères entre ces deux là). |
Si on souhaite rechercher le caractère représenté par l’un des métacaractères ci-dessus plutôt que de l’utiliser pour son sens spécial (par exemple si on souhaite rechercher le signe moins), il faudra alors le protéger ou « l’échapper » avec un antislash.
Notez qu’il faudra également protéger les caractères de classe (les crochets) ainsi que le délimiteur de masque (le slash) si on souhaite les inclure pour les rechercher dans une classe de caractères. Dans le cas contraire, cela peut poser des problèmes car le navigateur pourrait penser par exemple que ce n’est pas « ] » qui est cherché mais la classe qui est refermée.
See the Pen
Cours JavaScript 9.3.2 by Pierre (@pierregiraud)
on CodePen.
Ici, nous avons créé 8 masques différents. Le premier masque utilise le caractère ^
en début de classe de caractère. Ce caractère va donc être interprété selon son sens de métacaractère et on va donc rechercher tout ce qui n’est pas dans la classe. Notre masque va donc nous permettre de chercher tous les caractères d’une chaine qui ne sont pas des voyelles minuscules. Notez que les espaces sont également des caractères et vont être trouvés ici.
Dans notre deuxième masque, on protège le métacaractère ^
avec un antislash. Cela neutralise le sens spécial du caractère « ^ » et nous permet de le rechercher comme n’importe quel autre caractère dans notre classe. Notre masque va donc nous permettre de trouver toutes les voyelles de notre chaine plus le caractère « ^ ».
Dans notre troisième masque, on utilise le caractère « ^ » au milieu de la classe. Celui-ci ne possède donc pas son sens de métacaractère et nous n’avons pas besoin ici de le protéger. Ce troisième masque va nous permettre de chercher les mêmes choses que le précédent.
Notre quatrième masque utilise le métacaractère -
. Dans le cas présent, il indique que notre classe de caractère contient toutes les lettres minuscules de a à z, c’est-à-dire tout l’alphabet. Notre masque va donc trouver toutes les séquences contenant une lettre de l’alphabet minuscule suivie d’un « o ».
Notez bien ici que les lettres qui ne font pas partie strictement de l’alphabet anglais commun (c’est-à-dire les lettres accentuées, les lettres avec cédilles, etc.) ne seront pas ici trouvées.
Dans notre cinquième masque, on définit deux plages ou intervalles de caractères grâce au métacaractère -
. Ici, toutes les lettres de l’alphabet minuscules ou majuscules vont correspondre aux critères de la classe. Le masque va donc nous permettre de chercher toutes les séquences contenant une lettre de l’alphabet minuscule ou majuscule suivie d’un « o ».
Dans notre sixième masque, on protège cette fois-ci le caractère « – » . Notre masque va donc nous permettre de trouver les caractères « a », « – » et « z ».
Dans notre septième masque, on utilise cette fois-ci le métacaractère -
pour définir une place numérique (les regex vont nous permettre de trouver n’importe quel caractère, que ce soit une lettre, un chiffre, un signe, etc.). Notre masque va donc trouver n’importe quel chiffre (de 0 à 9), la lettre « a », le lettre « z » et le caractère « – ». En effet, le caractère est ici également mentionné en fin de classe et ne possède donc pas de sens spécial et n’a pas besoin d’être protégé.
Finalement, notre dernier masque va nous permettre de trouver un chiffre ou un caractère parmi les caractères « / », « [ » et « ] ». Ici, il faut échapper chacun de ces trois caractères afin de pouvoir les rechercher en tant que tels et afin que notre expression régulière fonctionne.
Les classes de caractères abrégées ou prédéfinies
Le caractère d’échappement ou de protection antislash va pouvoir avoir plusieurs rôles ou plusieurs sens dans un contexte d’utilisation au sein d’expressions régulières. On a déjà vu que l’antislash nous permettait de protéger certains métacaractères, c’est-à-dire que le métacaractères ne prendra pas sa signification spéciale mais pourra être cherché en tant que caractère simple.
L’antislash va encore pouvoir être utilisé au sein de classes de caractères avec certains caractères « normaux » pour au contraire leur donner une signification spéciale.
On va ainsi pouvoir utiliser ce qu’on appelle des classes abrégées pour indiquer qu’on recherche un type de valeurs plutôt qu’une valeur ou qu’une plage de valeurs en particuliers.
Les classes abrégées les plus intéressantes sont les suivantes (faites bien attention aux emplois de majuscules et de minuscules ici !) :
Classe abrégée | Description |
---|---|
\w | Représente tout caractère de « mot » (caractère alphanumérique + tiret bas). Équivalent à [a-zA-Z0-9_] |
\W | Représente tout caractère qui n’est pas un caractère de « mot ». Equivalent à [^a-zA- Z0-9_] |
\d | Représente un chiffre. Équivalent à [0-9] |
\D | Représente tout caractère qui n’est pas un chiffre. Équivalent à [^0-9] |
\s | Représente un caractère blanc (espace, retour chariot ou retour à la ligne) |
\S | Représente tout caractère qui n’est pas un caractère blanc |
\t | Représente une espace (tabulation) horizontale |
\v | Représente une espace verticale |
\n | Représente un saut de ligne |
See the Pen
Cours JavaScript 9.3.3 by Pierre (@pierregiraud)
on CodePen.
Ici, notre premier masque correspond à n’importe quel caractère alphanumérique ainsi qu’au tiret bas et nous permet de rechercher ces caractères.
Notre deuxième masque nous permet lui de trouver tous les caractères qui n’appartiennent pas à la classe [a-ZA-Z-0-9_]
, c’est-à-dire tout caractère qui n’est ni une lettre de l’alphabet de base ni un chiffre ni un underscore.
Notre troisième masque nous permet de trouver tous les caractères qui sont des chiffres dans une chaine de caractères.
Finalement, notre dernier masque nous permet de trouver n’importe quel chiffre dans la chaine de caractères ainsi que toutes les lettres minuscules (hors lettres accentuées et à cédille). Vous pouvez remarquer qu’on inclue ici notre classe abrégée dans une classe « classique » définie avec des crochets. Cela est en effet tout à fait autorisé.