JavaScript - Expressions régulières

Utilité des expressions régulières

Chaque expression régulière permet de décrire un ensemble de chaînes de caractères.
L'expression régulière /[Mm]aths?/ correspond à une famille, un ensemble ou une classe de quatre mots "Math math Maths maths".
/[\-\+]?\d+(\.\d+)?/ correspondra à l'ensemble des écritures décimales des nombres entiers ou décimaux, précédées ou non des signes + ou -.

Les expressions régulières permettent de réaliser aisément divers travaux sur des textes.
Elles permettent d'extraire des informations ou de modifier des parties bien ciblées de ces textes.

L'écriture des expressions régulières est pratiquement identique dans un grand nombre de languages informatiques, en apprenant à les utiliser en javascript vous saurez ensuite les utiliser en Awk, en Perl ...

Premiers exemples d'expressions régulières

Vous pouvez définir une expression régulière en l'insérant entre deux "/" comme dans /[Mm]ath[s]{0,1}/ on peut aussi utiliser la fonction RegExp pour créer une expression régulière et la fonction compile pour modifier une expression régulière.
var expression = new RegExp("[Mm]ath[s]{0,1}");  // math Math maths Maths 
Dans [Mm]aths?, le début [Mm] représente soit M soit m, ensuite les trois lettres ath représentent elles-mêmes et enfin [s]{0,1} 0 fois ou une fois la lettre s ce que l'on aurait d'ailleurs pu écrire s?? indique que le caractère précédent est optionnel.
Les paramètres "g" (global), et "i" (ignore-case) modifient le comportement des expressions régulières.
expression.compile("[Mm]aths?");   // même effet, le s est optionnel
expression.compile("[Mm]aths?", "g");   // "g" pour global : toutes les occurrences cherchées
expression.compile("maths?", "gi");   // "i" pour ignore-case : ignore la "casse" (Maj. ou miniscule)
Les paramètres modificateurs "g" (global), "i" (ignore-case) et "m" (multi-line) modifient le comportement des expressions régulières.
var expression = new RegExp("[Mm]ath[s]{0,1}");  // math Math maths Maths

Les expressions régulières sont très utiles, elles permettent d'effectuer des traitements de chaînes de caractères : tests, recherches, dénombrements ou remplacements de certaines parties de la chaîne.

Les méthodes javascript suivantes utilisent des expressions régulières :

String.search(RegExp) pour chercher la première occurrence correspondant à RegExp dans une chaîne ,
String.match(RegExp) permet de rechercher soit l'une soit toutes les occurrences de RegExp,
String.replace(RegExp, chaine) permet de remplacer la première ou toutes les occurrences de RegExp par le contenu de la variable chaine,
s.replace(r, function(str,p1,offset,s){...}) Exemple de récupération dans une fonction de la valeur numérique d'une zone parenthésée de l'expression régulière. L'exemple est adapté d'un document Mozilla.
split(RegExp) permet de découper une chaîne de caractères en plusieurs parties séparées par les occurrences de RegExp et de les placer dans un tableau.


Construisez vos propres exemples

Lorsque vous cliquez sur un exemple proposé dans cette page, le code javascript correspondant s'affiche aussi dans la fenêtre ci-dessous. Vous pouvez le modifier, l'adapter à vos besoins ou le réécrire en totalité pour vous exercer et apprendre à programmer en javascript.
Cliquez sur le bouton [Calcule] pour exécuter le code présent dans la fenêtre et sur [<-] pour retourner à l'emplacement d'origine de l'exemple.

Pour éviter l'utilisation de la fonction 'alert' qui ouvre des petites fenêtres agaçantes à refermer, une fonction 'alerte' moins dérangeante a été écrite pour le même usage, il vous suffit d'effacer la lettre 'e' finale pour revenir à la fonction javascript.




   




Essayez ces petits exemples :  1 ,  2 ,  3 ,  4 ,


Caractères spéciaux

Spéciaux tels quels

la plupart des caractères comme a b c ... z A B ... Z 0 1 ... 9 ne représentent qu'eux-mêmes, mais d'autres caractères permettent d'étendre le champ des représentations comme montré ci-dessous.


Les caractères étudiés dans la table ci-dessous ont une utilisation particulière dans les expressions régulières.
caractères utilité
^ 1) /^r/ une occurrence de l'expression régulière 'r' au début de la chaîne de caractères
2) /^r/m une occurrence de l'expression régulière 'r' au début de chaque ligne de la chaîne
3)[^abc] tout caractère autre que a, b ou c
\^ permet de noter le signe ^ lui-même et rien d'autre
$ I - Dans l'expression régulière :
1) /r$/ une occurrence de l'expression régulière 'r' à la fin de la chaîne de caractères
2) /r$/m une occurrence de l'expression régulière 'r' à la fin de chaque ligne de la chaîne
\$ permet de noter le signe dollar $ lui-même et rien d'autre
II - Dans une chaîne de substitution utilisée par la méthode s.replace(r, subst) on peut utiliser $n, $nn (1 ou 2 digits n suivant la zone entre parenthèses choisie), $' (avant), $` (après), $& (toute la zone). Écrire $$ pour obtenir le signe $.
[ ] 1) [abc] l'un quelconque des caractères placés entre les deux crochets
2) [^abc] tout caractère autre que ceux placés entre les deux crochets
\[ \] permettent de noter les crochets et rien d'autre
( ) 1) (r r') permet de grouper une succession de plusieurs expressions régulières r r' pour un traitement particulier du lot
2) (r) permet de réserver la valeur de l'occurrence pour la retrouver à l'aide de la notation $1, $2 ... ou $9 et l'utiliser ensuite
3) (r | r') correspond à r ou r'
\( \) permettent de noter les parenthèses et rien d'autre
{ } r{2} une succession de deux occurrences de r consécutives
r{2,7} de deux à 7 occurrences consécutives de r
On peut aussi utiliser r{2,} pour 2 occurrences et plus.
\{ et \} permettent de noter les accolades
. un point le point . correspond à toute occurrence de tout caractère
\. est utilisé pour noter le point . lui-même dans une expression régulière
* r* est utilisé pour indiquer 0 ou plusieurs occurrences de r
\* est utilisé pour noter le caractère * lui-même dans une expression régulière
/r*r'/ correspond à 0 ou plusieurs occurrences de r suivies d'une occurrence de r'.
\ slash inverse \ permet de modifier la signification du caractère qui suit.
. est une expression régulière pour tout caractère alors que \. est un point
s est le caractère s alors que \s est une expression régulière pour tout blanc (espace, tabulation, saut de ligne ...)
\\ est utilisé pour dans une expression régulière pour indiquer le caractère antislash \
/ slash / permet d'indiaquer le début et la fin d'une expression régulière /rr'.../
\/ est le caractère 'divise' / comme dans l'expression régulière /[\-\+]?(0|[1-9][0-9]*)\/[1-9][0-9]*/ d'une fraction
? point d'interrogation /r?/ indique que l'expression régulière r est présente ou pas
\? est le caractère ?
signe + /r+/ pour une ou plusieurs occurrences consécutives de l'expression régulière r
\+ est le caractère +
signe - [0-9] le - permet d'indiquer un intervalle de valeurs
\- est le caractère -
ont une utilisation spéciale dans les expressions régulières. Pour ne représenter que ces caractères et leur enlever toute autre signification, vous devez les écrire précédés du signe "\" comme dans \^ \$ \[ \] \( \) \{ \} \. \* \\ \/ \? \+ \-


Caractères spéciaux lorsque précédés le l'antislash

On a vu au paragraphe précédent que \* est le caractère étoile, alors que * a une signification spéciale.
Ici il s'agit en quelque sorte de l'inverse.
Alors que s n'est que la lettre elle-même et rien d'autre, l'écriture \s est une expression régulière pour tous les "blancs", les espaces de plusieurs types.

expression régulière utilité
\cCar caractère de contrôle
\cC correspond à 'Control-C'
\d digit
\D non-digit
\b frontière entre un blanc et un non-blanc (word caractère)
\B Qui n'est pas une frontière \b
\s blanc, espace ou tabulation ou saut de ligne équivaut à [\n\f\r\t\v]
\S non-blanc
\f saut de page
\n saut de ligne
\t tabulation horizontale
\v tabulation verticale
\w "word character" caractère alphanumérique ou _
\w équivaut à [a-zA-Z0-9_]
\W N'est pas un alphanumérique


Captures de chaînes

Si vous désirez modifier certains passages d'un texte en les réutilisant en partie, il est nécessaire de les connaître avant de les modifier.

Exemple :
Dans "A5b A22b zx495ab B123cX E85bu B45bv B63aer" vous désirez modifier les mots en gardant les chiffres centraux et en échangeant les deux côtés gauche et droit.
s.replace(/([a-zA-Z]+)(\d+)([a-zA-Z]+)/g,"$3$2$1");
devrait convenir.
Les zones entre parenthèses ( ... ) de l'expression régulière sont numérotées à partir de 1 gauche jusqu'à 9 au maximum (dans l'exemple, il n'y a que trois zones) et on peut les retrouver dans chaque occurrence, leurs valeurs peuvent être utilisées dans la chaîne de replacement en les notant $1, $2, ... $9 (au maximum 9) ou $1, $2, ... $99 pour des versions plus récentes de javascript.

$& insère l'occurrence trouvée,
$` insère la partie qui précède l'occurrence et
$' insère la partie qui suit.
Lorsque c'est nécessaire, $$ permet d'écrire un simple signe $.

Un exemple de récupération à l'aide d'une fonction s.replace(r, function(str,p1,offset,s){...}) a été donné plus haut dans cette page.
Dans le corps de la fonction vous pouvez récupérer les valeurs qui vous intéressent, elles sont dans les arguments (que vous pouvez lire et utiliser comme bon vous semble).
Le 1er argument est l'occurrence, les suivants p1, p2 ... sont les valeurs des zones délimitées par les parenthèses et enfin les deux derniers arguments sont la position de l'occurrence dans la chaîne initiale puis la chaîne elle-même.
Autre exemple.


Méthodes des expressions régulières

les objets 'RegExp' ont pour méthodes compile, exec et test.

méthode utilité
compile r.compile(s) et r.compile(s, a) permettent de modifier l'expression régulière r à l'aide d'un motif s et d'un attibut a qui est "g" ou "i" ou "m" ou leurs réunions.
exec t = r.exec(s) permet d'obtenir dans un tableau t des renseignements sur la première occurrence trouvée de l'expression régulière r dans la chaîne s.
La première occurrence trouvée est recopiée dans le premier élément t[0] du tableau t.
Si l'expression régulière r est fractionnée en zones par des parenthèses, les parties correspondantes de la chaîne se trouvent dans les éléments suivants du tableau.

Des appels successifs de la méthode exec permettent d'obtenir toutes les occurrences (et éventuellement les zones induites par les parenthèses), comme on peut le voir dans cet exemple où la première ligne est la chaîne proposée et où les différentes lignes suivantes contiennent l'occurrence suivie des trois zones.
Autre exemple qui lit et décortique cette page web pour en extraire tous les exemples, vous pourrez même les essayer, dans la réponse ! Éventuellement, les lire plus haut, dans la fenêtre.
test r.test(s) vaut 'true' ou 'false' s'il existe ou non une occurrence de l'expression régulière r dans la chaîne de caractères s


Testeur d'expressions régulières

RegExp r =     Attributs a =     Subst s = 

Texte t =

             





[Sommaire]  [Début]  [Fin]      <-  1  2  3  4  5  6  7  8  9  -> 


Documents - références - compléments - liens utiles

DOM:element.innerHTML at http://developer.mozilla.org/ Mozilla developer center
Document Object Model (DOM) Level 1 Specification WWW3C working Draft at www.w3.org
Standard ECMA-262 ECMAScript Language Specification. (La référence : ECMAScript est le véritable nom du JavaScript).a
JavaScript Shell 1.4
Pour pouvoir utiliser dans la page "JavaScript Shell 1.4" les exemples d'expressions régulières, commencez par définir la fonction alerte en faisant un copier-coller de : function alerte(s){alert(s);}
forum.alsacreations.com regexp














Pour un premier contact, [utilisez ce formulaire] ou utilisez l'adresse de messagerie qui y figure. Merci d'indiquer la page précise du site "http//jm.davalan.org/...", cela m'aidera beaucoup. Ne joignez aucun document à votre message.
Jeux-et-Mathématiques n'est pas un site commercial. Aucun des liens placés sur ce site n'est rémunéré, ni non plus aucune des informations données.
Important : Si votre question a un quelconque rapport avec un travail personnel (Devoir TIPE Master...) , vous devez absolument me le préciser dès votre premier message et m'indiquer très précisément les limites des informations demandées. Vous devez aussi avertir la personne qui dirige éventuellement votre travail ou le corrige de cette communication et lui montrer les documents fournis.

J'essaie de répondre aux questions posées, mais ne lis pas les documents mathématiques amateurs, pas plus que je ne donne mon avis sur les démonstrations des conjectures de Collatz ou autres. Je ne lis pas les documents word, je ne corrige pas les programmes informatiques et depuis des années je n'utilise plus de tableur.

© (Copyright) Jean-Paul Davalan 2002-2014