Fiche Javascript : Les expressions régulières

Objet de la fiche :

État de la fiche En cours


Plan de la fiche :

Avant propos

Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver et/ou modifier des portions de la chaîne correspondant au modèle.
Cette fiche à pour objet de vous permettre d'en connaître les principes de base, ainsi que quelques applications.

Exemples

  • Séparer un nom en prénom et nom,
  • Extraire les première et troisième colonnes d'un fichier utilisant une tabulation comme séparateur,
  • Trouver les occurences d'une devise dans un texte et les convertir en autre divise,
  • etc.. etc ..

Les méthodes

Il y a deux manières d'utiliser ce type d'expressions : soit par le biais de l'objet RegExp et ses méthodes ( test() et exec() ), soit par le biais de certaines méthodes de l'objet String ( match(), search(), split(), replace() ).

Méthodes utilisant les expressions régulières avec l'objet string

Méthodes Détails Résultats
.match(rgExp)

Recherche la correspondance dans une chaîne de caractères et renvoie un tableau d'informations ou null lorsqu'il n'y a pas de correspondance.

rgExp représente l'objet d'expression régulière contenant le modèle d'expression régulière et les indicateurs applicables, sous forme de nom d'une variable ou de chaîne contenant le modèle d'expression régulière et ses indicateurs.
On verra plus tard la signification détaillée de l'expression régulière simple utilisée dans cet exemple, mais cela permet de comprendre la syntaxe utilisée pour match.

Note relative à l'exemple :
si l'indicateur global g est présent l'expression sera analysée globalement et NULL ou un tableau d'informations seront retournés
Si l'indicateur global g n'est pas défini dans l'expression régulière, le tableau retourné par la méthode match a deux propriétés, input et index. La propriété input contient la chaîne recherchée dans son intégralité. La propriété index contient la première position de la sous-chaîne trouvée à l'intérieur de la chaîne recherchée.



.search(chaine)
.search(rgExp)

Teste la présence d'une correspondance dans une chaîne de correspondance et renvoie la position de la correspondance ou -1 s'il n'y en a pas.


Note relative à l'exemple :
Comme g , i est un indicateur global qui permet de ne pas tenir compte de la casse(majuscule/minuscule). Il peut cohabiter avec g, la syntaxe est alors la suivante : MaChaine.search(/train/gi). On utilise ici la méthode littérale pour initialiser les règles.


.split(chaine) Découpe une chaîne de caractères en un tableau comprenant les fragments résultants.
.replace(chaine) recherche une correspondance dans une chaîne de caractères et remplace cette correspondance par une chaîne de substitution.

Méthodes utilisant les expressions régulières avec l'objet RegExp

Méthodes Objets Détails Tests
.test(chaine) RegExp Applique l'expression régulière et renvoie true si le test est réussi autrement renvoie false.
Syntaxe : Objet RegExp.test(chaine)
.exec(chaine) RegExp Applique l'expression régulière, et renvoie un tableau dont le premier élément contient la portion de texte trouvée dans la chaîne de caractères. Si rien n'est trouvé, null est renvoyé.

Les règles

Modes d'initialisation des règles

De façon littérale : var regle = /modèle/flag;
ou
par le constructeur : regle = new RegExp("modèle", "flag")
suivant le type de méthode que l'on veut utiliser.

Paramètres

  • Le paramètre modèle décrit le modèle à appliquer afin d'exécuter une action.
  • Le paramètre flag décrit le type d'expression régulière :
    • Si flag vaut "g", l'expression sera analysée globalement sur l'ensemble de la chaîne (même sur plusieurs lignes).
    • Si flag vaut "i", l'expression sera analysée indifféremment sur les majuscules ou les minuscules.
    • Si flag vaut "m", (multiline) , Les caractères de début et de fin (^ et $) sont utilisés sur plusieurs lignes et correspondent au début et à la fin de chaque ligne délimitée par \n ou \r, et non plus au début ou à la fin de l'ensemble de la chaîne.
    • Si flag vaut "y", (adhésion) , ne correspond qu'à partir de l'indice fourni par la propriété lastIndex (toutes les correspondances suivantes ne sont pas utilisées)..
    • Les conditions précédentes peuvent se cumuler comme par exemple "gi".

Remarques

  • pas de quotes pour les paramètres (Modèle et flags) de la notation littérale.
  • Si le contenu de modèle contient des / il faudra les échapper par \/

Applications des règles

La syntaxe

Classes de caractères

Les classes de caractères sont des caractères définis entre crochets []

Les conditions

Une quelconque des lettres qui se trouve entre les crochets peut convenir.
Exemple : /br[ae]ves/ pour : braves ou breves.

Les intervalles

Si n'importe quelle lettre de l'alphabet peut convenir, il est donc inutile de les écrire toutes, il suffit de définir l'intervalle (séparation des deux valeurs par un tiret milieu) et écrire [a-z]. De même pour les caractères numériques on écrira [0-9].

Il est possible de définir plusieurs intervalles : exemple [a-z0-9] trouvera une lettre minuscule (de a à z) ou un chiffre (de 0 à 9).

Les exclusions

Pour exclure des caractères, il suffit d'insérer un accent circonflexe en début de la classe (juste après le premier crochet). Par exemple la règle [^éèê] ignorera les e accentués. L'exclusion d'un intervalle est possible; ansi [^7-9] exclura les chiffres de 7 à 9.

Jocker

Le point symbolise un caractère quelconque, à l'exception des sauts de ligne (les retours à la ligne). Ainsi la règle /gr.s/ trouvera gras,ou gres,ou gris etc...

Les quantificateurs

Les quantificateurs permettent de signaler combien de fois un caractère peut être recherché.

Quantificateurs Détails Exemples
? Le caractère qui précède ? peut apparaître 0 ou 1 fois consécutivement dans la chaine à tester
+ Le caractère qui précède + peut apparaître 1 ou plusieurs fois consécutivement dans la chaine à tester
* Le caractère qui précède * peut apparaître 0, 1 ou plusieurs fois consécutivement dans la chaine à tester

Les accolades

À la place des trois symboles vus précédemment, on peut utiliser des accolades pour définir explicitement combien de fois un caractère peut être répété. Trois syntaxes sont disponibles

  • {n} : le caractère est répété n fois
  • {n,m} : le caractère est présent de n à m fois. Par exemple, si on a {0, 5}, le caractère peut être présent de 0 à 5 fois
  • {n,} : le caractère est répété de n fois à l'infini.

Les accolades peuvent aussi permettre de contrôler précisément le nombre d'occurences dans une chaine de caractères

Exemples

  • E{4} : signifie 4 fois la lettre E majuscule
  • u{2,4} : signifie de 2 à 4 fois la lettre u minuscule
  • z{,5} : signifie de 0 à 5 fois la lettre z minuscule
  • X{8,} : signifie 8 fois minimum la lettre X majuscule.

Attention : Au sein d'une classe de caractères, il n'y a pas besoin d'échapper les métacaractères, à l'exception des crochets (qui délimitent le début et la fin d'une classe), du tiret (qui est utilisé pour définir un intervalle) et de l'anti-slash (qui sert à échapper).

On peut utiliser les opérateurs d'union (non marqué), d'intersection (&&) et de négation (^) :

  • [abc] ou [a-z] : La classe des trois caractères a, b et c, ou la classe de tous les caractères de a à z.
  • [^abc] : La classe de tous les caractères sauf a, b et c.
  • [a-zA-Z] ou [a-z[A-Z]] : L'union des classes [a-z] et [A-Z].
  • [123abc&&[a-z]] : L'intersection de la classe [123abc] et de la classe [a-z]

Parenthèses capturantes

Les parenthèses ( ) permettent de représenter une séquence de caractères et de capturer le résultat.

Exemple : "a(bc)+": chaîne qui contient "a" suivie de au moins une occurence de la chaîne "bc"

Les méta caractères

Ce sont des caractères qui sont interprétés par l'analyseur. Pour qu'un méta-caractère ne soit par interprété par l'analyseur, il faut le faire précéder du caractère '\'. Les caractères '-' et ']' ont un statut spécial : dans un intervalle ce sont des méta-caractères, et en dehors d'un intervalle ils se comportent comme des caractères normaux.

Types Descriptions
.(point) Remplace n'importe quel caractère, sauf la fin de ligne.
[ ] Intervalle de caractères.
{ } Quantificateur.
^ Négation ou début de ligne.
$ Fin de ligne.
? Le caractère qui précède ? peut apparaître 0 ou 1 fois consécutivement dans la chaine à tester.
+ Le caractère qui précède + peut apparaître 1 ou plusieurs fois consécutivement dans la chaine à tester.
* Le caractère qui précède * peut apparaître 0, 1 ou plusieurs fois consécutivement dans la chaine à tester.
\ Le caractère qui suit n'est plus considéré comme un méta-caractère.
| Opérateur ou.

Attention : à l'échappement si la chaine de caractère contient un méta caractère vu comme du texte

Les génériques

Les types génériques s'écrivent tous de la manière suivante : \x, où x représente une lettre. Voici la liste de tous les types génériques

Types Descriptions Exemples
\d Trouve un caractère décimal (un chiffre). Equivalent à [0-9]
\D Trouve un caractère qui n'est pas un chiffre. Equivalent à [^0-9]
\s Trouve un caractère blanc(espace, tabulation, retour à la ligne ...). Equivalent à [ \t\n\r\f\x0B]
\S Trouve un caractère qui n'est pas un caractère blanc. Equivalent à [^\s]
\w Trouve un caractère « de mot » : une lettre, accentuée ou non, ainsi que l'underscore. Equivalent à [a-zA-Z_0-9]
\W Trouve un caractère qui n'est pas un caractère « de mot ». Equivalent à [^\w]
\n Trouve un retour à la ligne
\t Trouve une tabulation

Spécificateurs de frontière.

Les spécificateurs de frontière sont des indicateurs permettant de dire où commence ou où finit le motif.

Types Descriptions Exemples
^ Début de ligne. (en mode multiligne )
$ Fin de ligne. (en mode multiligne )
\b Extrémité de mot.
\B Extrémité de non mot.
\A Le début de la séquence à analyser.
\G L'analyse du motif qui suit \G suit exactement l'analyse précédente du motif.
\Z La fin de la séquence à analyser, moins le caractère final.
\z La fin de la séquence à analyser.

Les assertions

Les assertions s'écrivent comme les types génériques mais ne fonctionnent pas tout à fait de la même façon. Un type générique recherche un caractère, tandis qu'une assertion recherche entre deux caractères.

Exemples généraux

Classes

  • [abc] : 1 lettre au choix parmis a, b ou c
  • [a-z], [b-e], [a-zA-Z]: lettre comprise entre a et z, b et e, a à z minuscules et A à Z majuscules
  • [0-9], [5-8] : chiffre compris entre 0 à 9 , 5 à 8
  • [abc-] [a-z-] : lettres a, b, c et le signe '-', toute lettre de a à z et le signe '-'
  • [^abc] [^a-d] : toute lettre sauf a, b, c , toutes les lettres sauf les lettres de a à d

Accolades

  • a{1,3} => uniquement a, aa, aaa
  • abc{2,4}d => uniquement abccd, abcccd, abccccd
  • a.{2,2}z => abbz, aXXz, akkz, ...

Combinaisons et utilisation de '\'

  • a\.*z => az, a.z, a..z, a.......z, mais ne trouvera pas abc
  • a.\*z => ab*z, a2*z, la 2eme lettre peut être n'importe quoi
  • a\++z => a+z, a++z, a+++z, a+++++++z mais ne trouvera pas az
  • a\+\+z => a++z et rien d'autre
  • a+\+z => a+z, aa+z, aaa+z, aaaaaaaa+z
  • a.?e => ae, abe, a-e, axe, ...
  • a\.?e => uniquement ae, a.e
  • a.\?e => a.?e, ab?e, aX?e, ...
  • a\.\?e => uniquement a.?e
  • ---------------------------------
  • 1\.\d\d\d4 => 1.1234, 1.9994, 1.0004, ...
  • a\Dz => aaZ, a%z, ... mais ne trouvera pas à a2z, a0z

Avec le point '.'

  • 123.5 => 123.5, 12345, 123s5, 123-5, ....
  • 12..5 => 12345, 123s5, 123-5, 12564, 12.45, ...
  • 3.14 => 3.14, 3114, 3f14, ...
  • 3\.14 => 3.14, ne trouve pas 3114, 3f14 ou autres

Avec '?'

Le caractère qui précède ? peut apparaître 0 ou 1 fois consécutivement.

  • 12?34 => 1234, 134
  • mes? amis? => mes amis, me ami, mes ami, me ami

Avec '*'

Le caractère qui précède * peut apparaître 0, 1 ou plusieurs fois consécutivement.

  • 12*34 => 134, 1234, 12234, 12222222234, ...

Avec '+'

Le caractère qui précède + peut apparaître 1 ou plusieurs fois consécutivement.

  • 12+34 => 1234, 12234, 12222222234, ... mais ne trouvera pas 134
  • /^[a-z0-9-]+$/ => en début de ligne, un ou plusieurs (signe +) caractères alphanumériques ou "_" .

Avec $

  • toto$ => toute ligne finissant pas toto

Construire des expressions régulières

La règle et l'utilisation de match().

Base de départ

Pour illustrer le propos nous nous baserons sur un texte tiré en partie de l'inventaire de Prévert.
un sculpteur qui sculpte des Napoléon
la fleur qu’on appelle souci
deux amoureux sur un grand lit
un receveur des contributions une chaise trois dindons
un ecclésiaaaastique un furoncle
une guêpe
un rein flottant
une écurie de courses...
un fils indigne deux frères ou dominidains trois sauterelles un strapontin
deux filles de joie un oncle Cyprien
une Mater dolorosaA trois papas gâteau deux chèvres de Monsieur Seguin
un talon Louis XV
un fauteuil Louis XVI
un tiroir dépaaareillé
un mal au rein et au reintal
une pelote de ficelle deux épingles de sûreté un monsieur âgé
des chiffres et des lettres 123455aMGTNNNN
une date 05/12/2014

Code utilisé

<script>
     regle=????? // voir le tableau;
     info="";
    result = monTexte.match(regle);
    for (i=0; i < result.length; i++){
        info += result[i] + "<br />"
    }
    document.write(info);
</script>

Exemples

Règles utilisées Résultats Commentaires
var regle=/a{2,4}/g; aa, aaa, aaaa et rien d'autre
var regle=/rein|fauteuil/g; rein ou fauteuil
var regle=/(rein|fauteuil)?/g; rein de reintal s'ajoute à la liste précédente
var regle=/domini[^c]/g; On trouve dominid de dominidains uniquement. dominic est exclu car le c et exclu, mais on pourrait trouver s'ils existaient dans le texte dominia, dominib etc .
var regle=/pel[l-m]./g; On trouve pelle de appelle uniquement, mais pas pel de pelote car le o est exclu.

La fonction replace()


Définitions Fonctions Tests
Une fonction qui permet de supprimer tous les espaces dans un chaine. Par exemple vous permettez la saisie d'un numéro de téléphone sous la forme 06 01 02 03 04, mais au niveau du test et du stockage vous voulez 0601020304 test = "06 01 02 03 04";
test = test.replace(new RegExp(' ', 'g'),'');
Entrez votre chaine :


Des fonctions qui permettent de remplacer dans une chaine, des caractères accentués par leurs équivalents non accentués. test = "ma chaine";
test = test.replace(/[éêèë]/gi,"e");
test = test.replace(/[àâ]/gi,"a");
test = test.replace(/[ù]/gi,"u");
Entrez votre chaine :


D'autres constructions

Définitions Fonctions Tests
Une fonction qui permet de tester la structure d'une URL

/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

Entrez votre URL :


Une fonction qui teste la validité d'un nom d'utilisateur

/^[a-z0-9_-]{3,16}$/

  • ^ : début de chine
  • [a-z0-9_-] : tous les caractères alphanumériques, plus les caractères "_" et "-".
  • {3,16} : 3 caractères minimum, 16 caractères maximum.
  • $ : fin de chaine.
Entrez votre nom d'utilisateur :


Une fonction qui teste la validité d'une adresse mail

/^[0-9a-z._-]+@{1}[0-9a-z.-]{2,}[.]{1}[a-z]{2,5}$/

  • ^ début de chaine
  • [0-9a-z._-] 1er groupe d'analyse. Accepte tous les caractères numériques, plus tous les caractères alphabétique en minuscule, plus le caractère point, plus le caractère tiret bas, plus le caractère tiret milieu.
  • +@{1} quantificateurs. Le caractère qui précède + peut apparaître 1 ou plusieurs fois consécutivement.
  • [0-9a-z.-] 2ème groupe d'analyse. Accepte tous les caractères numériques, plus tous les caractères alphabétique en minuscule, plus le caractère point, plus le caractère tiret milieu.
  • $ fin de chaine.
Entrez votre adresse mail :


Une fonction pour extraire l'extension d'un fichier dans une URL. var re = /(?:\.([^.]+))?$/; var ext = re.exec(SourceToPlay)[1];

Testeur expressions régulières



Application au projet de site web



Respectons la propriété intellectuelle