Expressions rationnelles : RegExp

But : traitement des chaînes de caractères (substitution, recherche)

Définition d'un modèle

Constructeur

reg = new RegExp('modele','option1', 'option2', ...); reg = /modele/options
Options

Méthodes

exec(chaine)recherche le modèle dans la chaîne et retourne un tableau des correspondances ECMA-262 ed. 3, JS 1.2
test(chaine)renvoie true si une correspondance modèle-chaîne a été trouvée ECMA-262 ed. 3, JS 1.2
exp = /jour/; exp.test("bonjour tout le monde")

NB : les expressions rationnelles sont utilisées dans les méthodes de la classe String match, replace, search

Modèle

Tout caractère sauf le retour à la ligne

.tout caractère
exp = /t.t./; exp.test("toto") exp.test("titi") exp.test("tintin")

Indicateurs d'occurrence

{n}le car. qui précède doit apparaître n fois
{n,}il doit apparaître au moins n fois
{n,m}au moins n fois et au plus m fois.
*le caractère peut apparaître 0 ou n fois = {0,}
+le caractère doit apparaître au moins une fois = {1,}
?le caractère doit apparaître 0 ou 1 fois = {0,1}
exp = /zo{2}/; exp.test("zo") exp.test("zozo") exp.test("zoo")

Alternative

a | ba ou b
exp = /bon(jour|soir)/; exp.test("bonjour") exp.test("bonsoir") exp.test("bon jour")

Classes de caractères

[abcd]un caractère parmi ceux présents dans les crochets
[a-z]un caractère de l'intervalle
[^cp]interdit les caractères c et p
\dchiffre (\d{2} = nombre à deux chiffres)
\Déquivalent à [^0-9]
\wlettres, chiffres, souligné
\Wtout ce qui n'est pas lettre, chiffre, souligné
\sespace, retour à la ligne, retour chariot, tabulation
\Stout ce qui n'est pas espace...
exp = /(\d{2}\s?){5}/; exp.test("0491113521") exp.test("04 91 11 35 21") exp.test("0 4 9 1 1 1 3 5 2 1")
Méthode match de la classe String
reg = /\d{2}/g; chtest = "11 novembre 2004"; tab = chtest.match(reg); chaine = ''; for (i=0; i < tab.length; i++){ chaine += 'tab['+i+'] = '+tab[i]+'\n'; } alert(chaine);

Lorsque le modèle est défini dans une chaîne il faut faire précéder les motifs spéciaux tels que \ par un \ exp_a = new RegExp("\\d+"); exp_a.test("0491113521") exp_b = new RegExp("\d+"); exp_b.test("0491113521")

Caractères spéciaux

\cAcaractère de contrôle, avec A un caractère (ex \cX = ctrl X)
[\b]caractère retour arrière (backspace)
\fsaut de page (form feed)
\nsaut de ligne (line feed)
\rretour chariot
\ttabulation
\vtabulation verticale
\0caractère NUL
exp = /\t/; exp.test("bonjour tout\tle monde") exp.test("bonjour tout le monde")

Caractère d'échappement \

Pour mettre les caractères spéciaux * + ? . / \ dans une expression rationnelle il faut les faire précéder d'un \.

exp = /\?/; exp.test("comment allez vous ?")

Correspondance dans la chaîne

^correspondance en début de chaîne ou de ligne (mode m)
$correspondance en fin de chaîne ou de ligne (mode m)
\bcorrespondance en début de mot
\Bcorrespondance en fin de mot
exp = /\d+/; exp.test("numero du secretariat 0491113521 !") exp = /^\d+/; exp.test("numero du secretariat 0491113521 !") exp.test("0491113521 !") exp = /\d+$/; exp.test("numero du secretariat 0491113521 !") exp.test("numero du secretariat 0491113521")

Parenthèses avec ou sans mémorisation des correspondances trouvées

Mémorisation
(a)
Méthode replace de la classe String
reg = /(\d{2}) (\w+) (\d{4})/; ma_date = "11 novembre 2004"; format_date = ma_date.replace(reg, "annee : $3\n mois : $2\n jour : $1"); alert(format_date);
Méthode exec : correspondances des n parenthèses dans les cases 1 à n
reg = /(\d{2}) (\w+) (\d{4})/; tab = reg.exec("11 novembre 2004"); chaine = ''; for (i=0; i < tab.length; i++){ chaine += 'tab['+i+'] = '+tab[i]+'\n'; } chaine += 'entree = '+tab.input+'\n' alert(chaine);
Sans mémorisation
(?:a)

Condition

a lorsqu'il est suivi de b
a(?=b) reg = /(serveur)(?= Apache)/; chaine = "le serveur Apache est un logiciel installe sur un ordinateur serveur"; chaine_modif = chaine.replace(reg, "logiciel"); alert(chaine_modif);
a lorsqu'il n'est pas suivi de b
a(!=b)

Exemples

Numériques

tel : 11.22.33.44.55
expressionrésultat
(\d{2}\.?){5} 11.22.33.44.55
(\d{2}\.?)+ 11.22.33.44.55
(\d{2}\.)+ 11.22.33.44.
[23]+ 22, 33

Alphabétiques

Pour le texte suivant : Objets inanimes, avez vous donc une ame qui s'accroche a notre ame et la force d'aimer ? Lamartine

expressionrésultat
ame ame, ame
a.e ave, ame
[a-zA-z]+ Objets, inanimes, avez, vous, donc, ...

Entraînez-vous

Voici un formulaire qui vous permet de tester les résultats trouvés par les méthodes test, search et match pour un texte donné et pour une expression rationnelle donnée.
l'expression entrée ne doit pas comporter les / /)

tester des expressions