Au cours des années 1940 se développe une théorie mathématique appelée
théorie des langages formels. Un langage est défini comme un ensemble
de «mots» qui s'articulent en «phrases» selon des règles, celle de sa
«grammaire». Le problème essentiels des langages formels consiste à
établir si une phrase respecte les règles de la grammaire, c'est-à-dire
si sa «syntaxe» est correcte. Les langages informatiques (Fortran,
Algol, Cobol etc) sont des langages formels. Il est donc naturel de
voir la théorie mathématique s'appliquer à l'informatique.
Une partie seulement du transfert nous concerne ici. Il s'agit de ce
qu'en anglais on appelle la théorie des «Regular Expressions», en
abrégé «RegEx», mais en bon français, «Expressions Rationnelles»
et par traduction littérale «Expressions Régulières». Elle relève
de la théorie des automates, mais cela est une autre histoire.
la problématique
La problématique est la suivante : on dispose d'une chaîne de
caractères, la chaîne d'étude, et d'une chaîne de caractère appelée
Motif qui décrit tout une famille de chaînes possibles ;
on recherche si la chaîne d'étude dans sa totalité se conforme
(le mot technique : match) au schéma donné par le Motif.
Un autre problème est de rechercher (le mot technique : search)
si la chaîne contient des sous-chaînes qui se conforment au Motif.
Par exemple, le Motif "[a-z]+" décrit toute chaîne de
caractère constituées uniquement des lettres minuscules de l'alphabet ;
la chaîne "azerty" se conforme (match) au motif. Ce n'est pas le cas
des chaînes "abcDefg", "abc efg", "abcde3" .
deux difficultés
L'application de cette problématique dans les langages présente deux
difficultés :
- La première est liée à l'encodage des caractères. Pendant longtemps,
l'utilisabilité des RegEx s'est engluée dans les questions d'encodage
des chaînes. Des langages comme Java et JavaScript ont très tôt
tranché pour l'Unicode ; il n'en est pas de même pour Python qui
a attendu sa version 3 pour avoir des RegEx simples et performantes.
- La seconde est celui d'une représentation efficace d'un langage
étranger (RegEx) à celui du codage (Python, JavaScript). La solution
retenue est celle de la compilation des chaînes descriptives ;
les motifs apparaissent alors comme de objets spécifiques au langage.
C'est un peu lourd mais c'est puissant. Les deux dossiers qui
suivent montrent des voies légèrement différentes utilisées en Python3
et JavaScript.
le module regex de Python
Le dossier ci-dessous s'applique à la version 3 de Python. Python a adopté
dès le début les normes d'un module indépendant dit module POSIX.
Mais jusque la version 2.7. Python a utilisé les codes ISO pour
l'encodage ; ce choix malheureux a provoqué quantité de problèmes
intéresants quant au travail sur les chaînes de caractères.
La littérature Python reste encombrée de considérations qui deviennent
obsolètes avec Python3 et son utilisation systématique de l'Unicode.
Il n'en reste pas moins que l'utilisation des Expressions Régulières
nécessite un véritable apprentissage de ce langage et de son adaptation
à Python. Mais dès que l'on a besoin de travailler sur des chaînes de
caractères, l'outil se révèle puissant et sommes toutes assez simple
en regard de l'élégance du code produit.
fiche 0 : trouver et remplacer dans une chaîne
1. Poser le problème
2. Trouver
3. Remplacer
4. Découper
fiche 1 : le module Python RE
1. Matching et Searching
2. Expression régulière
les jokers et marqueurs fondamentaux /
répétitions d'un caractère /
consommation /
gourmandise /
échappement
3. Des méthodes à recherches multiples
findall() /
méthode sub() /
split()
utilisation des expressions régulières en JavaScript
Dès sa création, JavaScript a fait deux choix fondamentaux, qui
malheureusement ont mis très longtemps à être reconnus:
- l'utilisation native de l'Unicode;
- l'insertion des expressions régulières au coeur du langage.
Les RegEx sont donc un élément constitutif du langage, au même
titre que l'objet Math, Date, String, Boolean, Array etc.
Penser en JavaScript, c'est donc disposer d'un outil de modélisation
aussi disponible que les objets Array ou les objets String.
Le document qui suit est en fait un chapitre du dossier sur le langages JavaScript, qui a été isolé pour des raisons de disponiblité : il ne faut surtout pas le voir comme un modules ajouté au langage, comme cela est le cas en Python ou en Perl. Il n'empêche que la conception de l'approche JavaScript a une origne extérieure, et qu'elle constitue une adaptation qui n'a rien d'original d'un module préexistant. La norme actuelle se réfère au PCRE (Perl Compatible Regular Exression) également présent dans Perl, Apache, PHP, et qui n'a pas été sans influence sur Python.
RegExp en JavaScript
1. Expressions Régulières
1.1. principe
1.2. Les objets RegExp
1.3. retour sur les objets String
2. Définition de la chaîne de motif
2.1. caractères littéraux
2.2. les classes de caractères
2.3. les répétiteurs
2.4. gourmandise
2.5. Les attributs ou drapeaux
3. Ancrage des RegExp7
3.1. La syntaxe
3.2. Début et fin de la chaîne de recherche
3.3. notion de mots
3.4. assertion vers l'avant
4. Expressions parenthésées (ou groupements)
4.1. Une chaîne de motif peut être parenthésée
4.2. la méthode de chaîne replace avec utilisation des sous-chaînes trouvées
4.3. utilisation du dullar dans les chaînes replace
5. Les méthodes
5.1. La méthode match() des instances de String sans l'attribut g
5.2. La méthode match() des instances de String avec l'attribut g