Depuis toujours en in­for­ma­tique, la recherche de ca­rac­tères donnés ou de séquences de ca­rac­tères concrètes dans des documents fait partie des tâches standard dont il faut ré­gu­liè­re­ment s’acquitter. L’objectif dans ce cas est souvent de modifier ou de remplacer des portions de texte ou des lignes de code. Cette tâche est d’autant plus complexe que la séquence de ca­rac­tères re­cher­chée apparaît plusieurs fois dans le document. Dans les années 1950 déjà, les experts avaient trouvé dans les langages formels de l’in­for­ma­tique théorique une solution qui marque aujourd’hui encore le dé­ve­lop­pe­ment de logiciels et simplifie largement ce type de tâches ré­pé­ti­tives sous la forme d’ex­pres­sions ré­gu­lières (angl. regular ex­pres­sions).

Qu’est-ce qu’une ex­pres­sion régulière ?

Les ex­pres­sions ré­gu­lières (angl. regular ex­pres­sions) sont les unités de des­crip­tion de langages ra­tion­nels faisant partie des langages formels. Elles sont un ins­tru­ment central de l’in­for­ma­tique théorique, qui forme notamment la base du dé­ve­lop­pe­ment et de l’exécution des pro­grammes in­for­ma­tiques ainsi que de la cons­truc­tion des com­pi­la­teurs requis à cet effet. C’est la raison pour laquelle les ex­pres­sions ré­gu­lières (souvent également qua­li­fiées de regex et reposant sur des règles syn­taxiques clai­re­ment définies) sont notamment utilisées dans le dé­ve­lop­pe­ment de logiciels.

Il existe pour chaque ex­pres­sion régulière un automate fini (également qualifié d’automate avec un nombre fini d’états) qui accepte un langage spécifié par l’ex­pres­sion et qui est développé à l’aide de la https://smart--grid.net/cours-lessons-theory/theorie-des-langages/cons­truc­tion-de-thompson/ - external-link-window "Pré­sen­ta­tion su concept sur smart-grid.net">cons­truc­tion de Thompson à partir d’une ex­pres­sion régulière. Il existe qui plus est pour chaque automate fini une ex­pres­sion régulière qui décrit le langage accepté par l’automate. Celle-ci peut être créée soit par l’al­go­rithme de Kleene soit par l’https://fr.wikipedia.org/wiki/%C3%89li­mi­na­tion_de_Gauss-Jordan - external-link-window "Article Wikipédia sur l’« éli­mi­na­tion d’états de Gauss »">éli­mi­na­tion d’états.

Note

Un automate est un modèle com­por­te­men­tal se composant d’états, de tran­si­tions d’état et d’actions. Il est qualifié de fini lorsque la quantité d’états qu’il peut accepter est finie (autrement dit limitée).

Un exemple connu de l’uti­li­sa­tion des ex­pres­sions ré­gu­lières en in­for­ma­tique est la fonction Re­cher­cher/remplacer des éditeurs de texte que le pionnier en in­for­ma­tique Ken Thompson l’un des dé­ve­lop­peurs du système d’ex­ploi­ta­tion UNIX a mis en place pour la première fois dans les années 1960 dans l’éditeur orienté ligne QED, puis dans son suc­ces­seur ed. Cette fonction permet de re­cher­cher des séquences de ca­rac­tères données dans des textes et de les remplacer éven­tuel­le­ment par une autre séquence de ca­rac­tères quel­conque.

Dé­fi­ni­tion : Ex­pres­sions Ré­gu­lières

Les ex­pres­sions ré­gu­lières (de l’anglais regular ex­pres­sions) sont des chaînes de ca­rac­tères sur la base de règles syn­taxiques per­met­tant de décrire des séquences de ca­rac­tères. Elles font de fait partie des langages ra­tion­nels – un sous-groupe des langages formels d’une grande im­por­tance notamment en in­for­ma­tique, et plus spé­ci­fi­que­ment dans le dé­ve­lop­pe­ment de logiciels.

Comment une ex­pres­sion régulière fonc­tionne-t-elle ?

Une ex­pres­sion régulière peut être composée soit ex­clu­si­ve­ment de ca­rac­tères normaux (par exemple abc) soit d’une com­bi­nai­son de ca­rac­tères normaux et de mé­ta­ca­rac­tères (par exemple ab*c). Le but des mé­ta­ca­rac­tères ici est de décrire des cons­truc­tions ou agen­ce­ments de ca­rac­tères donnés, par exemple de décrire si un caractère doit se trouver au début de la ligne, s’il doit ou peut n’ap­pa­raître qu’une seule fois ou plus ou moins souvent. Les deux exemples d’ex­pres­sions ré­gu­lières cités fonc­tion­nent ainsi de la manière suivante :

abc : le modèle simple de regex abc requiert une cor­res­pon­dance exacte. La recherche s’attachera donc à détecter des chaînes de ca­rac­tères contenant non seulement tous les ca­rac­tères « abc », mais les faisant également ap­pa­raître dans cet ordre précis. La cor­res­pon­dance demandée par l’ex­pres­sion se retrouve donc dans la question « Connais-tu l’abc ? » comme dans la phrase « Je dois encore soigner mon abcès ».

ab*c : des ex­pres­sions ré­gu­lières avec des ca­rac­tères spéciaux fonc­tion­nent en revanche un peu dif­fé­rem­ment, car la recherche se fait non seulement au niveau de cor­res­pon­dances exactes, mais aussi de scénarios spéciaux. L’étoile (également appelée « as­té­risque ») dans ce cas veille à recherche de chaînes de ca­rac­tères com­men­çant par la lettre « a » et finissant par la lettre « c », mais pouvant avoir entre les deux un nombre quel­conque de lettres « b ». Il y aura donc une cor­res­pon­dance non seulement dans « abc », mais aussi dans les chaînes de ca­rac­tères « abbbbc » et « cbbabbcba ».

Chaque regex peut par ailleurs être reliée à une action concrète, comme la fonction « Remplacer » déjà citée. Cette action est réalisée partout où l’ex­pres­sion régulière cor­res­pon­dante apparaît, c’est-à-dire partout où il y a une cor­res­pon­dance exacte, comme dans les exemples présentés.

Quels enjeux sont liés à l’emploi d’ex­pres­sions ré­gu­lières ?

Toute personne tra­vail­lant avec des ins­truc­tions de regex a une grande liberté, car il y a toujours plusieurs options de solution pour chaque mission devant être résolue avec une ex­pres­sion régulière. Il n’est néanmoins pas toujours avan­ta­geux qu’un résultat souhaité puisse être obtenu de dif­fé­rentes manières :

Vous pouvez par exemple garder les ins­truc­tions à un niveau très général pour atteindre l’objectif visé quoi qu’il arrive. Si vous voulez en revanche le résultat le plus précis possible, vous devrez im­pé­ra­ti­ve­ment formuler un modèle de regex spé­ci­fique. Il est également conseillé de faire attention à la longueur : plus une ex­pres­sion régulière est concise, plus sa durée de trai­te­ment est courte. Elle doit néanmoins toujours être lisible. Car si vous souhaitez modifier ul­té­rieu­re­ment les ex­pres­sions ré­gu­lières utilisées, vous devrez faire face à un obstacle de taille si les ins­truc­tions initiales sont trop com­pli­quées, et qui plus est sans com­men­taire.

Lors de la création d’ex­pres­sions ré­gu­lières, il s’agit donc de trouver un rapport optimal entre la concision et la spé­ci­fi­cité.

Quelles règles syn­taxiques s’ap­pli­quent aux ex­pres­sions ré­gu­lières ?

Comme indiqué pré­cé­dem­ment, les ex­pres­sions ré­gu­lières peuvent être employées dans divers langages (par exemple Perl, Python, Ruby, Ja­vaS­cript, XML ou HTML), l’uti­li­sa­tion ou la fonction pouvant alors être très dif­fé­rentes. Dans Ja­vaS­cript, les modèles de regex sont par exemple utilisés pour les méthodes String search(), match() ou replace(), alors que les ex­pres­sions dans les documents XML servent à limiter les contenus des éléments. En matière de syntaxe, il n’y a quasiment aucune dif­fé­rence entre les dif­fé­rents langages de pro­gram­ma­tion et de balisage pour ce qui tourne autour des ex­pres­sions ré­gu­lières :

Une ex­pres­sion régulière peut ainsi se diviser en trois parties au maximum, in­dé­pen­dam­ment du langage dans lequel elle est utilisée :

Motif (modèle de recherche) L’élément central est le motif, autrement dit le modèle de recherche général. Il peut s’agir soit ex­clu­si­ve­ment de ca­rac­tères simples, soit d’une com­bi­nai­son de ca­rac­tères simples et de ca­rac­tères spéciaux, comme expliqué au chapitre précédent.
Dé­li­mi­teur (caractère de sé­pa­ra­tion) Le début et la fin du motif sont ca­rac­té­ri­sés par le dé­li­mi­teur. En principe, tous les ca­rac­tères non al­pha­nu­mé­riques (à l’exception de la barre oblique inversée) peuvent être con­si­dé­rés comme des ca­rac­tères de sé­pa­ra­tion. PHP prévoit par exemple comme dé­li­mi­teurs au choix des hashtags (#motif#), des pour­cen­tages (%motif%), des signes plus (+motif+) ou des tildes (~motif~). Dans la plupart des langages, on utilise cependant des guil­le­mets droits ("motif") ou des barres obliques (/motif/).
Mo­di­fi­ca­teur Les mo­di­fi­ca­teurs peuvent être ajoutés à un modèle de recherche afin de modifier l’ex­pres­sion régulière. Il y a par exemple le mo­di­fi­ca­teur i, qui supprime la sen­si­bi­lité à la casse. Celle-ci veille à ce que l’écriture en lettres capitales et mi­nus­cules joue un rôle et s’applique de manière standard à toutes les ex­pres­sions ré­gu­lières.

Les ca­rac­tères spéciaux syn­taxiques types pouvant étendre les motifs à des options données com­pren­nent notamment :

Ca­rac­tères spéciaux syn­taxiques des regex Fonction
[] Une paire de crochets ca­rac­té­rise une classe de ca­rac­tères qui existe toujours pour un seul caractère dans un modèle de recherche.
() Une paire de pa­ren­thèses ca­rac­té­rise un groupe de ca­rac­tères se composant d’un ou de plusieurs ca­rac­tères et pouvant être imbriqués.
- Sert d’in­di­ca­tion de plage (de [… ] à […]) quand il se trouve entre deux ca­rac­tères normaux
^ Limiter la recherche au début d’une ligne (autre fonction : inverseur dans les classes de ca­rac­tères)
$ Limiter la recherche à la fin d’une ligne
. Cor­res­pond à n’importe quel caractère
* Le nombre de ca­rac­tères, de classes ou de groupes devant un as­té­risque peut être n’importe lequel (y compris zéro).
+ Le caractère, la classe ou le groupe devant un signe plus doit être présent(e) au moins une fois.
? Le caractère, la classe ou le groupe devant un point d’in­ter­ro­ga­tion est optionnel(le) et ne peut ap­pa­raître qu’une fois au maximum.
{n} Le caractère, la classe ou le groupe précédent(e) apparaît exac­te­ment n fois.
{n,m} Le caractère, la classe ou le groupe précédent(e) apparaît au moins n fois et au maximum m fois.
{n,} Le caractère, la classe ou le groupe précédent(e) apparaît au moins n fois ou plus.
\b Tenir compte de la limite de mots lors de la recherche
\B Ignorer la limite de mots lors de la recherche
\d N’importe quel chiffre ; abré­via­tion de la classe de ca­rac­tères [0-9]
\D N’importe quel caractère autre qu’un chiffre ; abré­via­tion de la classe de ca­rac­tères [^0-9]
\w N’importe quel caractère al­pha­nu­mé­rique ; abré­via­tion de la classe de ca­rac­tères [a-zA-Z_0-9]
\W N’importe quel caractère autre qu’un caractère al­pha­nu­mé­rique ; abré­via­tion de la classe de ca­rac­tères [^\w]

Tutoriel : les pos­si­bi­li­tés des ex­pres­sions ré­gu­lières ex­pli­quées à l’aide d’exemples

Après un résumé des bases des regex dans les pa­ra­graphes pré­cé­dents de cet article, le tutoriel suivant doit montrer le fonc­tion­ne­ment des chaînes de ca­rac­tères pratiques. Les dif­fé­rentes pos­si­bi­li­tés et astuces syn­taxiques sont indiquées ici à l’aide d’exemples concrets d’ex­pres­sions ré­gu­lières, tant pour des ex­pres­sions simples que complexes.

Ex­pres­sions ré­gu­lières à un élément

La forme de regex la plus simple est un modèle de recherche ne prévoyant qu’un seul élément à trouver. Dans la mesure où vous ne cherchez pas un élément concret, une ex­pres­sion régulière à un élément par exemple peut être définie sans problème à l’aide d’une classe de ca­rac­tères. Avec l’ex­pres­sion suivante, les résultats possibles sont les chiffres « 1 », « 2 », « 3 », « 4 », « 5 », « 6 » ou « 7 » :

[1234567]

Étant donné que les nombres se succèdent di­rec­te­ment dans ce cas, la forme sim­pli­fiée suivante serait également possible :

[1-7]

Si l’ex­pres­sion régulière est modifiée de sorte que le chiffre « 4 » est exclu de la recherche, vous pouvez également utiliser la variante sim­pli­fiée avec le signe moins :

[1-35-7]
Note

Les dif­fé­rents ca­rac­tères d’un motif de regex ne sont pas séparés par des espaces.

Ex­pres­sions ré­gu­lières à plusieurs éléments

Même pour une ex­pres­sion régulière à plusieurs éléments, vous pouvez tra­vail­ler avec des classes de ca­rac­tères afin d’avoir dif­fé­rents résultats possibles. Si l’ex­pres­sion comprend par exemple deux éléments pour lesquels dif­fé­rents résultats sont en­vi­sa­geables, il vous suffit d’ordonner deux classes de ca­rac­tères cor­res­pon­dantes l’une à la suite de l’autre :

[1-7][a-c]

Une des lettres « a », « b » ou « c » suit ainsi le premier élément, un chiffre compris entre « 1 » et « 7 ». Comme indiqué pré­cé­dem­ment, les mi­nus­cules sont obli­ga­toires. Avant de traiter ici les mo­di­fi­ca­teurs, vous pouvez déjà vous attaquer à la petite mo­di­fi­ca­tion suivante de l’ex­pres­sion Inclure les ma­jus­cules :

[1-7][a-cA-C]

Ex­pres­sions ré­gu­lières avec des éléments en option

Que vous cherchiez plusieurs éléments dans une seule ex­pres­sion régulière ou à l’aide de plusieurs groupes de ca­rac­tères, il est possible que des éléments donnés ne puissent ou ne doivent être contenus que sous certaines con­di­tions. Cela serait par exemple en­vi­sa­geable dans le cas d’une ex­pres­sion régulière devant filtrer tous les numéros de maison. Le numéro de maison n’est parfois composé que d’un seul chiffre, mais les résultats obtenus com­pren­nent aussi des numéros se composant de deux ou même de trois chiffres. Il y a qui plus est des adresses pour les­quelles une lettre est ajoutée au numéro de maison. Cet ensemble de com­bi­nai­sons possibles peut être couvert idéa­le­ment par les ins­truc­tions de regex suivantes :

[1-9][0-9]?[0-9]?[a-z]?

Le seul élément obli­ga­toire de ce modèle de recherche est un chiffre compris entre « 1 » et « 9 ». Deux chiffres compris entre « 0 » et « 9 » suivis d’une lettre quel­conque peuvent être choisis en option, ce qui est ca­rac­té­risé res­pec­ti­ve­ment par le point d’in­ter­ro­ga­tion placé après.

Alors que la cons­truc­tion pour des numéros à trois chiffres suivis d’une lettre sup­plé­men­taire est encore assez claire, il n’en est rien pour des numéros allant jusqu’à dix chiffres. Dans ce cas, il est re­com­mandé d’utiliser des accolades, comme dans l’exemple suivant d’ex­pres­sions ré­gu­lières :

[1-9][0-9]{0,9}

Comme dans l’exemple précédent, la recherche se concentre tout d’abord sur un chiffre compris entre « 1 » et « 9 », puis soit aucun, soit jusqu’à neuf chiffres compris entre « 0 » et « 9 ». Le résultat peut donc aller jusqu’à dix chiffres.

Ex­pres­sion régulière avec n’importe quelle fréquence des ré­pé­ti­tions

Dans les exemples pré­cé­dents d’ex­pres­sions à un ou plusieurs éléments, les nombres minimal et maximal de ca­rac­tères étaient connus. Il existe néanmoins bien évi­dem­ment des cas dans lesquels la quantité de ca­rac­tères d’une regex ne doit pas être définie exac­te­ment à l’avance. Les pa­ra­mètres requis sont alors l’as­té­risque et le signe plus, qui per­met­tent d’autoriser un nombre quel­conque de ré­pé­ti­tions d’un caractère, d’une classe ou d’un groupe de ca­rac­tères. Toutes les chaînes de ca­rac­tères peuvent ainsi être saisies avec n’importe quelle quantité de chiffres (même « zéro »), par exemple avec l’ex­pres­sion régulière suivante :

[0-9]*

La même remarque s’applique quand une com­bi­nai­son concrète de ca­rac­tères est re­cher­chée, dans laquelle un (ou plusieurs) caractère(s) peut/peuvent être répété(s) x fois. Comme dans l’exemple suivant :

an*

Les cor­res­pon­dances possibles sont dans ce cas aussi bien le mot « amidon » que « anémone » et « annuaire ». Si le premier résultat doit être exclu ou si le caractère spécifié doit ap­pa­raître au moins une fois, il faut utiliser au lieu de cela le signe plus :

an+

Inverser les classes de ca­rac­tères

Si vous voulez utiliser des ex­pres­sions ré­gu­lières avec des classes de ca­rac­tères qui re­pré­sen­tent en principe un ou plusieurs ca­rac­tères, mais qui excluent ici un ou plusieurs ca­rac­tères donnés comme résultat, vous avez besoin de l’inverseur « ^ » (accent cir­con­flexe). Il est toujours entre les pa­ren­thèses d’une classe de ca­rac­tères et n’est valable qu’entre ces pa­ren­thèses. L’ins­truc­tion suivante donne un bon exemple de classe de ca­rac­tères inversée :

b[^u]lle

Dans le cas du deuxième caractère, il peut dans ce cas s’agir d’un caractère quel­conque sauf « u » ; le mot « balle » offre donc les cor­res­pon­dances requises. Le mot « bulle » en revanche non, car il ne cor­res­pond pas à l’ex­pres­sion régulière.

Ca­rac­tères de subs­ti­tu­tion

Les ex­pres­sions ré­gu­lières per­met­tent également de tra­vail­ler avec des ca­rac­tères de subs­ti­tu­tion qui peuvent se trouver au choix au milieu d’un modèle de recherche pour un, aucun ou plusieurs caractère(s) (suivant le mé­ta­ca­rac­tère utilisé). Le caractère de subs­ti­tu­tion est ici créé par un point que vous combinez avec le caractère spécial énuméré au­pa­ra­vant pour les ré­pé­ti­tions quand un résultat autre qu’un caractère in­di­vi­duel est souhaité. Des ex­pres­sions ré­gu­lières de ce type per­met­tent par exemple d’analyser une base de données à la recherche d’une personne dont vous con­nais­sez certes le nom et le prénom, mais dont vous ne savez pas si elle est en­re­gis­trée avec un deuxième prénom :

Jean .*Dupont

Les résultats possibles sont dans ce cas aussi bien « Jean Eric Dupont » (ainsi que n’importe quelle autre com­bi­nai­son avec un deuxième prénom), « Jean E. Dupont ou « Jean Dupont ». Si vous ne devez tenir compte que de variantes avec un deuxième prénom, utilisez un signe plus à la place de l’as­té­risque :

Jean .+Dupont

Un bon exemple d’uti­li­sa­tion per­ti­nente d’un caractère de subs­ti­tu­tion pour un caractère in­di­vi­duel est le modèle de recherche suivant, qui cor­res­pond aussi bien à « bal » qu’à « bol » :

b.l

Solutions al­ter­na­tives

Vous avez la pos­si­bi­lité de formuler des ex­pres­sions ré­gu­lières de manière à avoir deux ou plusieurs solutions al­ter­na­tives pour une cor­res­pon­dance. Il faut dans ce cas séparer les solutions al­ter­na­tives par une barre verticale, comme dans l’exemple suivant :

Fraise|Framboise

« Fraise » comme « Framboise » offrent donc tous deux une cor­res­pon­dance.

En variante, il est également possible d’in­ter­ve­nir au milieu de mots ou de séquences de ca­rac­tères en recourant à des groupes :

(Lun|Mar|Mercre|Jeu|Vendre|Same)di|Dimanche

Dans cet exemple, chaque jour de la semaine est un résultat potentiel, tous les noms de jours de la semaine se terminant par « di » proposés en al­ter­na­tive étant saisis cor­rec­te­ment grâce au re­grou­pe­ment entre pa­ren­thèses, même dans la forme abrégée.

Groupes

Les groupes de ca­rac­tères comme dans l’exemple du pa­ra­graphe précédent sont con­si­dé­rés au même titre que les classes de ca­rac­tères comme des éléments struc­tu­rels d’ex­pres­sions ré­gu­lières. Ils peuvent être définis par une paire de pa­ren­thèses et re­pré­sen­tent en principe un motif composé d’un ou de plusieurs ca­rac­tères – stricto sensu, chaque regex est donc un groupe, la ca­rac­té­ri­sa­tion par les pa­ren­thèses étant dans ce cas supprimée. Dans les ex­pres­sions, les groupes accordent la pos­si­bi­lité d’appliquer des opé­ra­teurs comme le caractère de sé­pa­ra­tion ou de ré­pé­ti­tion (signe plus ou as­té­risque) à une ex­pres­sion partielle souhaitée :

ab(cd)+

La ré­pé­ti­tion quel­conque souhaitée s’applique donc dans ce cas au groupe de ca­rac­tères « cd », alors qu’elle ne se serait appliquée pour la même or­tho­graphe sans guil­le­mets qu’au « d ». Dans une regex, il n’y a aucune li­mi­ta­tion par rapport à la quantité de groupes contenus.

Im­bri­ca­tions

Non seulement un nombre de groupes quel­conque peut exister dans une ex­pres­sion régulière, mais autant de groupes que souhaité peuvent s’imbriquer les uns dans les autres afin d’exprimer des relations complexes entre des ca­rac­tères simples et des ca­rac­tères spéciaux, même sans chaînes de ca­rac­tères inu­ti­le­ment longues. Un exemple de cela est le modèle de regex suivant, qui a comme résultats possibles quatre modèles au­to­mo­biles « Golf VW », « Polo VW », « Fiat Punto » ou « Fiat Panda » :

((Golf|Polo) VW|Fiat (Punto|Panda))

Limites de mots

S’il faut tenir compte de limites de mots, autrement dit du début ou de la fin d’une séquence al­pha­nu­mé­rique pour l’ap­pli­ca­tion d’une ex­pres­sion régulière, un mé­ta­ca­rac­tère doit le spécifier. De nombreux langages utilisent pour cela la com­bi­nai­son « \b » qui peut précéder le modèle de recherche, le suivre, ou le précéder et le suivre.

La première variante prescrit que la séquence de recherche se trouve au début du mot :

\bun

Une cor­res­pon­dance pour cette ex­pres­sion régulière est par exemple le mot « uniforme ». Le mot « muni » ne peut en revanche pas être un résultat possible, car la lettre « m » précède le caractère recherché. Pour inverser la tendance, utilisez la variante n° 2 et faites-la suivre du caractère spécial :

un\b

Avec la troisième option, vous dé­fi­nis­sez les deux mots limites comme une condition. Le seul résultat possible dans ce cas précis est donc l’article indéfini (ou le pronom/chiffre) « un » :

\bun\b

An­nu­la­tion de la méta-sig­ni­fi­ca­tion de ca­rac­tères spéciaux

Au pa­ra­graphe précédent, la barre oblique inversée avait pour fonction que le « m » suivant ne soit pas considéré comme une lettre, mais comme un mé­ta­ca­rac­tère. Si on le combine aux ca­rac­tères qui font partie de manière standard des ca­rac­tères spéciaux syn­taxiques des regex, il a exac­te­ment l’effet inverse : le caractère est traité comme n’importe quel autre caractère littéral. Cette pos­si­bi­lité vous permet aussi de re­cher­cher sans problème une date concrète avec une ex­pres­sion régulière :

11\.10\.2019

La date « 11.10.2019 » est la seule chaîne de ca­rac­tères cor­res­pon­dant dans ce cas aux critères de recherche demandés. Sans la barre oblique inversée, les deux points seraient con­si­dé­rés comme les ca­rac­tères de subs­ti­tu­tion d’un caractère quel­conque, rendant de fait également possible des résultats comme « 1101092019 » ou « 11a10b2019 ».

« Alléger » des ex­pres­sions ré­gu­lières gour­mandes

L’emploi de quan­ti­fi­ca­teurs (« ? », « + », « * », « {} ») veille de manière standard à ce qu’une ex­pres­sion soit « gourmande » et à chercher le maximum de cor­res­pon­dances possibles. Étant donné que ce com­por­te­ment n’est pas toujours sou­hai­table, les quan­ti­fi­ca­teurs peuvent être spécifiés dans une ex­pres­sion régulière de manière à limiter leur « gour­man­dise ». L’exemple suivant permet d’expliquer plus con­crè­te­ment ce processus de mo­di­fi­ca­tion :

A.*B

Appliquée à la séquence de ca­rac­tères suivante « ABCDEB », cette ex­pres­sion gourmande n’ar­rê­te­rait pas la recherche à « AB », mais en­re­gis­tre­rait comme résultat l’ensemble de la séquence de ca­rac­tères. Si la recherche doit en revanche s’in­ter­rompre après le premier « B » trouvé, il faut procéder à la mo­di­fi­ca­tion évoquée. Dans de nombreux langages (notamment Perl, Tcl, HTML), un point d’in­ter­ro­ga­tion est placé à cet effet après les quan­ti­fi­ca­teurs :

A.*?B

En variante, l’ex­pres­sion gourmande initiale peut également être remplacée par l’ex­pres­sion équi­va­lente « non gourmande » pour arriver au même résultat :

A[^B]*B
Note

La li­mi­ta­tion des ex­pres­sions ré­gu­lières gour­mandes complique le trai­te­ment d’un modèle de recherche et est donc associée à une durée de recherche plus longue.

Aller au menu principal