Expressions régulières

Pourquoi ?

pour chercher / vérifier / remplacer du texte

Comment ?

un langage qui décrit des chaînes de caractères.

Par exemple :

Une expression régulière qui reconnaît tous les mots qui commencent par une majuscule et sont composés d'un nombre quelconque de lettres minuscules.

	/[A-Z][a-z]*/
      

/.../ délimite l'expression.

Utilisation

Le langage des expressions régulières

Séquences et caractères simples

symbolesensexemple
.n'importe quel caractère/.../ = 3 caractères quelconques
lettre, caractère "normal"le caractère en question/abc/ = un "a", puis un "b", puis un "c"
\nPassage à la ligne
\tTabulation
\u0000caractère unicode /\u03B2/ pour β
\wlettre latine non accentuée
\dchiffre
\scaractère d'espacement (espace, tabulation, passage à la ligne)
\W, \D, \Snégation des précédents
\\, \*, \+, \.le "\" permet de "protéger" les caractères spéciaux pour pouvoir les reconnaître /\.\.\./ reconnaît trois points (comparer avec ci-dessus)

Intervalles

[...] : permettent de délimiter un ou plusieurs intervalles ou ensembles de caractères.

Ensemble de caractères

il suffit de mettre les caractères en question entre les crochets :

	  [aeiouy]
	

reconnaît n'importe quelle voyelle

Intervalle

Suite de caractères dans unicode. Exemple [0-9] n'importe quel chiffre

Négation

"^" : caractères qui ne sont pas dans l'ensemble.

Exemple [^0-9] : caractère qui n'est pas un chiffre.

"-"

Pour mettre le "-" dans un ensemble, on le place en premier :
	[-a-z]
      
reconnaît toute lettre minuscule ou "-".

Combinaison

On peut mettre entre crochets plusieurs intervalles et des caractères isolés : [0-9A-E.] reconnaît toute chiffre hexadécimal ou ".".

Répétition/optionalité

*, +, ? porte sur le dernier élément. Sinon, il faut des (...) :

/a[a-z]+/ : reconnaît les mots qui commencent par a

/(a[a-z])+/ : reconnaît les mots dont les lettres impaires sont des "a" ("ananas")

Disjonction

	[0-9]+\s*(francs|euros)
      

Autres opérateurs

Exemples :

Pour les frontières de mots, \b signifie que le texte reconnu à cet endroit doit se trouver à une limite de mot. Il ne "consomme" pas de caractère.

Si s est un texte, s.match(/un/) reconnaît "cinq colonnes à la une."

mais s.match(/\bun\b) ne reconnaît que les textes qui contiennent le mot "un"

Options des regexp

Exemples

Parenthèses et groupes

Les parenthèses délimitent des groupes. La première parenthèse ouvrante délimite le groupe 1, la seconde le groupe 2, etc...

On peut extraire les groupes, mais aussi les utiliser dans l'expression elle-même. \1 désigne le texte reconnu par le premier groupe, \2 par le second, etc...

Exemple /([0-9])\1+/ reconnaît un même chiffre répété au moins deux fois ("111" ou "33333" mais pas "123")

Pour qu'une parenthèse ne crée pas de groupe, on utilise (?:....) :

	/(?:\s|,)/
  

string.match

Exemples

	if (s.match(/[0-9]+/)) {
          ...
	}
      

"si s contient un entier"

	var t= s.match(/[0-9]+/);
	if (t != null) {
	  val= t[0]; 
	}
      

Vérifie que s contient un entier et extrait le texte en question dans val.

string.split

Deux versions

string.replace

Prend deux arguments : une regexp et une string

Ne modifie pas la chaîne à laquelle elle s'applique

Exemple :
	s1= s.replace(/\s+/g, "-");
      
Remplace toutes (/g) les suites d'espaces par un "-".

g : sans le "g", on remplace uniquement la première occurrence

String replace, et les groupes

On peut utiliser $0, $1,... dans la chaîne de remplacement pour désigner une partie de la chaîne d'origine

Exemple : remplacer toutes les occurrences de NOMBRE eur./euros par NOMBRE €

	s= "le prix est de 300 eur., mais on peut transiger à 199 euros."
	s= s.replace(/([0-9]+)\s*(eur\.|euros)/g, "$1 \u20AC");
	alert(s);
      

Construction d'une regexp

Regexp et unicode

Exercices

Exercice1

Reprendre l'exercice sur l'âge, le nom et l'adresse mail en utilisant les expressions régulières

Exercice2

Écrire un code qui permette de vérifier qu'un texte est bien une adresse IP, et qui en extraie les quatre parties

Exercice3

On tape une suite de nombre (y compris des réels) dans un champ, séparés par des espaces ou des retour-chariot, et on veut calculer leur somme. Adaptez avec des expressions régulières