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
[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];