Classes de caractères
Considérons un exemple pratique -- nous avons un numero de téléphone tel que "+7(903)-123-45-67", et nous souhaitons le convertir en nombres purs : 79031234567.
Pour ce faire, nous pouvons rechercher et supprimer tout ce qui n'est pas un nombre. Les classes de caractères peuvent nous aider.
Une *classe de caractères* est une notation spéciale qui correspond à n'importe quel symbole d'un certain ensemble.
Pour commencer, explorons la classe "digit". Elle s'écrit comme pattern:\d et correspond à "n'importe quel chiffre".
Par exemple, recherchons le premier chiffre dans le numéro de téléphone :
let str = "+7(903)-123-45-67";
let regexp = /\d/;
alert( str.match(regexp) ); // 7
Sans l'indicateur pattern:g, l'expression régulière ne recherche que la première correspondance, c'est-à-dire le premier chiffre pattern:\d.
Ajoutons l'indicateur pattern:g pour trouver tous les chiffres :
let str = "+7(903)-123-45-67";
let regexp = /\d/g;
alert( str.match(regexp) ); // liste de correspondances: 7,9,0,3,1,2,3,4,5,6,7
// Obtenons un numéro de télephone composé uniquement de ces chiffres:
alert( str.match(regexp).join('') ); // 79031234567
C'était une classe de caractères pour les chiffres. Il existe également d'autres classes de caractères.
Les plus utilisés sont :
pattern:\d ("d" vient de "digit" ("chiffre")) : Un chiffre: un caractère de 0 à 9.
pattern:\s ("s" vient de "space" ("espace")) : Un symbole d'espace: inclut les espaces, les tabulations \t, les sauts de ligne \n et quelques autres caractères rares, tels que \v, \f et \r.
pattern:\w ("w" vient de "word" ("mot")) : Un caractère "verbeux": soit une lettre de l'alphabet latin, soit un chiffre ou un trait de soulignement _. Les lettres non latines (comme le cyrillique ou l'hindi) n'appartiennent pas au pattern:\w.
Par exemple, pattern:\d\s\w signifie un "chiffre" suivi d'un "caractère espace" suivi d'un "caractère verbeux", tel que match:1 a.
Une expression régulière peut contenir à la fois des symboles normaux et des classes de caractères.
Par exemple, pattern:CSS\d correspond à une chaîne match:CSS suivi d'un chiffre :
let str = "Is there CSS4?";
let regexp = /CSS\d/
alert( str.match(regexp) ); // CSS4
On peut également utiliser les classes de caractères :
alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'
La correspondance (chaque classe de caractères d'expression régulière a le caractère de résultat correspondant) :
Classes inverses
Pour chaque classe de caractères, il existe une "classe inverse", notée avec la même lettre, mais en majuscule.
L'"inverse" signifie qu'il correspond à tous les autres caractères, par exemple :
pattern:\D : Non-chiffre: tout caractère sauf pattern:\d, par exemple une lettre.
pattern:\S : Non-espace: tout caractère sauf pattern:\s, par exemple une lettre.
pattern:\W : Caractère non verbal : tout sauf pattern:\w, par exemple une lettre non latine ou un espace.
Au début du chapitre, nous avons vu comment créer un numéro de téléphone uniquement à partir d'une chaîne telle que subject:+7(903)-123-45-67: trouver tous les chiffres et les concaténer.
let str = "+7(903)-123-45-67";
alert( str.match(/\d/g).join('') ); // 79031234567
Une autre manière, plus courte, consiste à rechercher un motif non numérique pattern:\D et à le supprimer de la chaîne:
let str = "+7(903)-123-45-67";
alert( str.replace(/\D/g, "") ); // 79031234567
Un point est "n'importe quel caractère"
Un point pattern:. est une classe de caractères spéciale qui correspond à "n'importe quel caractère sauf une nouvelle ligne".
Par exemple:
alert( "Z".match(/./) ); // Z
Ou au milieu d'une expression régulière:
let regexp = /CS.4/;
alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (l'espace est aussi un caractère)
Veuillez noter qu'un point signifie "n'importe quel caractère", mais pas "l'absence de caractère". Il doit y avoir un caractère avec lequel le faire correspondre :
alert( "CS4".match(/CS.4/) ); // null, pas de correspondance car il n'y a pas de caractère pour le point
Point tel que n'importe quel caractère avec l'indicateur "s"
Par défaut, un point ne correspond pas au caractère de saut de ligne \n.
Par exemple, l'expression rationnelle pattern:A.B correspond à match:A, puis match:B avec n'importe quel caractère entre eux, sauf un saut de ligne \n:
alert( "A\nB".match(/A.B/) ); // null (pas de correspondance)
Il existe de nombreuses situations où nous aimerions qu'un point signifie littéralement "n'importe quel caractère", y compris le saut de ligne.
C'est ce que fait l'indicateur pattern:s. Si une expression rationnelle l'a, alors un point pattern:. correspond littéralement à n'importe quel caractère :
alert( "A\nB".match(/A.B/s) ); // A\nB (correspondance!)
Résumé
Il existe les classes de caractères suivantes :
pattern:\d-- chiffres.pattern:\D-- non-chiffres.pattern:\s-- symboles d'espace, tabulations, sauts de ligne.pattern:\S-- tout saufpattern:\s.pattern:\w-- Lettres latines, chiffres, soulignement'_'.pattern:\W-- tout saufpattern:\w.pattern:.-- n'importe quel caractère avec l'indicateur d'expression régulière's', sinon tout sauf un saut de ligne\n.
...Mais ce n'est pas tout!
Le codage Unicode, utilisé par JavaScript pour les chaînes de caractères, fournit de nombreuses propriétés aux caractères, tels que : à quelle langue la lettre appartient (si c'est une lettre), si c'est un signe de ponctuation, etc.
Nous pouvons également faire une recherche selon leurs propriétés. Cela nécessite l'indicateur pattern:u, couvert dans le prochain article.