Web log de Serge Boisse
On line depuis 1992 !
Je suppose que vous savez à quoi servent les regex, ou expressions régulières.. Sinon, allez voir ici : javascript
Cette page résume donc l'essentiel à savoir pour utiliser les Regex.
https://regex101.com/
ou ci-dessous un petit script pour tester
\w
matche les majuscules, minuscules, chiffres et underscores.
\W
matche tout ce qui n'est pas matché par \w
\d
matche les chiffres. Son contraire : \D
\d
matche les chiffres. Son contraire : \D
\s
matche les whitespaces (inclut " ", "\t" et "\n"). Son contraire : \S
|
est le ou inclusif : (toto|titi)
matche ces deux mots. Noter qu'on a créé un groupe avec ()
.
matche n'importe quel caractère sauf les sauts de ligne (sauf flags globaux s
)
/
et \
doivent être échappés, c'est à dire précédés de \
Une classe est un groupe de caractères ou de méta séquences. On groupe des caractères entre []
et le ou |
devient optionnel.
Par exemple [0123456789]
est équivalent à \d
Dans une classe on peut heureusement créer des ranges avec -
. exemple [A_Za-z]
équivaut à w
mais ne matche pas _
ni les chiffres. Attention, [a-Z]
est une erreur, mais pas A-z
("a" > "Z" en ASCII)
Attention les caractères accentués comme "é" ne sont pas dans a-z
!
Pour chercher un -
dans une classes on écrit \-
[^abc]
matche un caractère qui n'est pas "a","b",ni "c"
[^a-z]
matche tout caractère sauf une minuscule
Il y a des classes prédéfinies : [[:alpha:]]
[[:alnum:]]
, [[:punct:]]
?
Pour matcher n caractères d'une classe, on écrit le nombre voulu entre {}
Par exemple la regex suivante matche une chaine de quatre chiffres : ([0-9]){4}
Remarque, ici les parenthèses sont inutiles : [0-9]{4}
marche aussi.
On peut aussi matcher un range d'occurences. ([0-9]){2,4}
matche s'il y a 2 à 4 chiffres
La classe [a-zA-ZáàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ]
accepte presque toutes les lettres accentuées françaises, allemandes, etc. On peut aussi utiliser
[A-Za-zÀ-ÖØ-öø-ÿŠŐőŰűȘŞœŸŒ]
qui est encore plus générale et qui marche aussi pour le Turc par exemple. Attention, si on veut récupérer des noms de famille latins, certains contiennent '
ou -
ou
comme "O'Donoghe" ou "De Bourbon-Parme".
Si on veut ajouter le cyrillique (russe, etc.), il faudrait ajouter А-я
donc utiliser [A-Za-zÀ-ÖØ-öø-ÿŠŐőŰűȘŞœŸŒА-я]
Elles servent à chercher les positions dans un texte.
^
est le début d'une ligne. ^\d
matchera un seul chiffre au début de chaque ligne. (si flags /gm
)
$
est la fin d'une ligne
\b
est le "word boundary" ? Par exemple \elle\b
matchera "elle" mais pas "belle". Attention \b\b
matche aussi les mots vides.
Les regex peuvent être utilisées pour chercher des récurrences de séquences, par exemple un mot avec un certain nombre de caractères
e?
permet de trouver 0 ou 1 correspondance de "e". Avec la chaine "elle est beeelle ?", cela matchera 19 fois, dont 7 "e" et 12 chaînes vides. Attention si on écrit [e?]
il y aura 8 mariages : (les 7 "e" et le "?")
e*
trouver 0,1,ou plus, "e" successifs. Cela matchera 17 fois, dont 4 "e", 1 "eee" et 12 chaines vides
e+
trouver 1 ou plus, "e" successifs. Donc 5 mariages : 4 "e" et un "eee"
e{2}
trouve 2 "e". Ici un seul mariage sur les deux premiers "e" de "beeele".
e{1,3}
trouves des suites formées de un à trois "e". donc 5 mariages ici (comme e+
)
e(,3}
trouve juste les chaines avec 0 à 3 "e". Donc ici 17, comme e*
Un groupe est un fragment de regex situé entre ()
. Un groupe peut contenir n'importe quoi (caractères, classes, quantificateurs, et même un autre sous-groupe)
Imaginons que je cherche les prénoms composés (commençant par une majuscule) dans le texte :
"prénoms improbables : Francine-Edna, Ayanna-Angèle, etc".
On peut essayer [A-Z][A-zéè]+-[A-Z][A-zéè]
.
OK, mais je veux séparer les deux prénoms sans récupérer le tiret. Je vais créer deux "capturing" groupes entre ()
comme suit :
([A-Z][A-zèé]+)-([A-Z][A-zèé]+)
. Il y aura 2 captures, le groupe 1 contiendra "Francine" et "Ayanna", le groupe 2 "Edna" et "Angèle"
?:
au début d'un groupe permet de ne pas capturer le groupe.
Exemple, on a une liste d'URL genre :
http://sboisse.free.fr/index.html
ftp://onapasdeftp.net/toto
https://sitesecurise.org/
Imaginons qu'on veut les liens commençant par https
et ftp
, mais pas ce qu'il y a après.
On peut essayer https|ftp:\/\/\w+.\w{2,6}
mais ça ne matchera que ftp://onapasdeftp.net
et https
Donc on groupe : (https|ftp):\/\/\w+.\w{2,6}
matche les deux derniers Urls, mais capture ("ftp" et "https") .
(https|ftp):\/\/(\w+.\w{2,6})
crée deux groupes, l'un qui capture "ftp" et "onapasdeftp.net", l'autre qui capture "https" et "sitesecurise.org".
Mais si on essaie (https|ftp)?::\/\/(\w+.\w{2,6})
le premier groupe capture uniquement "ftp" et le second "https", comme dans le second essai.
En revanche (?:https|ftp):\/\/(\w+.\w{2,6})
capture uniquement le second groupe, soit ""onapasdeftp.net" et "sitesecurise.org"
La méta séquence de groupe ?=
est un "lookahead". on matchera tout ce qui suit, mais ce groupe ne sera pas capturé. Par exemple (?=.*\d)
matche 0 ou plusieurs .
suivis d'un chiffre, mais il n'y aura pas de capture.
enfin ?!
crée un groupe d'exclusion (negative loohead). Par exemple dans notre liste d'URLs, ^\w+(?=.)
matche "https", "ftp"," et "http". mais si je ne veux pas "http" on écrit ^\w+(?=\.)(?!\.http)
NE MARCHE PAS
en javascript une regex peut s'écrire littéralement /pattern/
ou bien /pattern/flags
exemple const re = /ab\+c/;
pour rechercher "ab+c"
si on crée un regex à partir d'une chaine de caracères il faut escaper les caractères spéciaux notament \
On peut passer des flags globaux en second argument.
const re = new RegExp("ab\\+c");
idem. (noter le \
en plus)
on peut utiliser la fonction suivante
function escapeRegExp(stringToGoIntoTheRegex) {
return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
console.log.escapeRegExp("abc");
const myRe = new RegExp("d(b+)d", "g");
let message: string = 'Hello, World!';
console.log(message);
à la fin de la regexpr, après le "/" final. on peut en mettre plusieurs.
g
: global. Toutes les correspondances (ne pas retourner après la première correspondance)
m
: multiligne. Fait en sorte que ^
et $
correspondent au début/à la fin de chaque ligne (et pas seulement au début/à la fin de la chaîne).
i
recherche indépendante de la casse.
s
permet à .
de matcher les sauts de ligne
Les expressions régulières sont utilisées avec les méthodes RegExp test()
et exec()
et avec les méthodes String match()
, matchAll()
, replace()
, replaceAll()
, search()
et split()
.
test()
Renvoie True (si match) ou False
const myRe = /d(b+)d/g; // cherche "d" suivi de 1 ou plusieurs "b" suivi de "d"
const myArray = "cdbbdbsbz";
console.log(myRe.test(myArray));
true
reg.exec()
renvoie un Array d'informations ou null
On peut l'utiliser avec le flag global "d" pour avoir les indices :
const myRe = /d(b+)d/gd; // cherche "d" suivi de 1 ou plusieurs "b" suivi de "d"
const myArray = "cdbbdbsbz";
console.log(myRe.exec(myArray));
[ 'dbbd',
'bb',
index: 1,
input: 'cdbbdbsbz',
groups: undefined,
indices: [ [ 1, 5 ], [ 2, 4 ],
groups: undefined ]
]
Attention les champs ci-dessus ne sont pas toujours renvoyés.
Pour avoir toutes les correspondances il faut re-appeler exec
avec exactement le même arguments sous forme de variable.
Pour plus d'infos voir RegExp.prototype.exec (page web)
String match()
renvoie un tableau contenant toutes les correspondances en une seule fois, y compris les groupes de capture, ou null si aucune correspondance n'est trouvée.
const myRe = /d(b+)f/g; // cherche "d" suivi de 1 ou plusieurs "b" suivi de "f"
const myArray = "cdbbfadbfblabla";
console.log(myArray.match(myRe)); // [ 'dbbf', 'dbf' ]
Entrez la Regex sans les deux /
. Ce script suppose le flag global g
.
On note que le "dernier index" est en fait celui à partir duquel on cherchera un nouveau match.
video :
voir https://www.youtube.com/watch?v=XPrnB_v4NX8
référence : https://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean/22944075#22944075
page créée le 18/03/2025 à 15:09
modifiée le 27/05/2025 à 16:38
Commentaires (0) :
Page :Ajouter un commentaire (pas besoin de s'enregistrer)
En cliquant sur le bouton "Envoyer" vous acceptez les conditions suivantes : Ne pas poster de message injurieux, obscène ou contraire à la loi, ni de liens vers de tels sites. Respecter la "netiquette", ne pas usurper le pseudo d'une autre personne, respecter les posts faits par les autres. L'auteur du site se réserve le droit de supprimer un ou plusieurs posts à tout moment. Merci !Ah oui : le bbcode et le html genre <br>, <a href=...>, <b>b etc. ne fonctionnent pas dans les commentaires. C'est voulu.