JavaScript - Expressions régulières
Utilité des expressions réguliè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
/[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
[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? où ? 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)
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
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.
Caractères spéciaux
Spéciaux tels quels
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.
| 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 - |
\^ \$ \[ \] \( \) \{ \} \. \* \\ \/ \? \+ \-
Caractères spéciaux lorsque précédés le l'antislash
\* 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
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
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
Documents - références - compléments - liens utiles
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);}
Pour un premier contact, [utilisez ce formulaire] ou recopiez l'adresse qui y figure. Merci d'indiquer la page précise "http://jeux-et-mathématiques.davalan.org/" de la page du site, cela m'aidera et évitera toute confusion. Ne joignez aucun document.
Important : Si votre question a un quelconque rapport avec un travail personnel (Devoir TIPE Master...) , vous devez absolument me le préciser dès maintenant et m'indiquer très précisément les limites des informations demandées. Vous devez aussi avertir la personne qui dirige 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-2013
