Introduction et syntaxe des expressions régulières

Pourquoi utiliser des expressions régulières ?

Les opérations de recherche et de remplacement typiques nécessitent que vous fournissiez le texte exact qui correspond aux résultats de recherche attendus. Bien que cette technique puisse être suffisante pour effectuer des tâches simples de recherche et de remplacement sur du texte statique, son manque de flexibilité rend la recherche de texte dynamique difficile, voire impossible, de cette manière.

En utilisant des expressions régulières, vous pouvez :

1. Tester les modèles dans une chaîne.
Par exemple, vous pouvez tester une chaîne d'entrée pour voir si un modèle de numéro de téléphone ou un modèle de numéro de carte de crédit apparaît dans la chaîne. C'est ce qu'on appelle la validation des données.

2. Remplacer le texte.
Les expressions régulières peuvent être utilisées pour identifier un texte spécifique dans un document, supprimer entièrement ce texte ou le remplacer par un autre texte.

3. Extrayez les sous-chaînes des chaînes en fonction de la correspondance de modèles.
Vous pouvez trouver un texte spécifique dans le document ou le champ de saisie.

Par exemple, vous devrez peut-être effectuer une recherche sur l'ensemble du site, supprimer les éléments obsolètes et remplacer certaines balises de formatage HTML. Dans ce cas, des expressions régulières peuvent être utilisées pour déterminer si ce matériel ou cette balise de formatage HTML apparaît dans chaque fichier. Ce processus réduit la liste des fichiers concernés à ceux qui contiennent des éléments qui doivent être supprimés ou modifiés. Les expressions régulières peuvent ensuite être utilisées pour supprimer le matériel obsolète. Enfin, les expressions régulières peuvent être utilisées pour rechercher et remplacer des balises.

Expression régulière - Syntaxe

L'expression régulière (expression régulière) décrit un modèle de correspondance de chaîne, qui peut être utilisé pour vérifier si une chaîne contient une certaine sous-chaîne, et la sous-chaîne correspondante Remplacer une chaîne ou extraire une sous-chaîne qui répond à une certaine condition d'une chaîne, etc.

Lors de la liste des répertoires, *.txt dans dir *.txt ou ls *.txt n'est pas une expression régulière, car la signification de * ici est différente de celle de * dans les expressions régulières.

Construire des expressions régulières revient à créer des expressions mathématiques. Autrement dit, de petites expressions peuvent être combinées pour créer des expressions plus grandes à l’aide d’une variété de métacaractères et d’opérateurs. Les composants d'une expression régulière peuvent être un caractère unique, une collection de caractères, une plage de caractères, une sélection entre des caractères ou toute combinaison de tous ces composants.

Les expressions régulières sont des modèles littéraux composés de caractères ordinaires (tels que les caractères de a à z) et de caractères spéciaux (appelés « métacaractères »). Un modèle décrit une ou plusieurs chaînes à rechercher lors de la recherche de texte. Les expressions régulières servent de modèle qui fait correspondre un modèle de caractères avec une chaîne recherchée.

Caractères normaux

Les caractères normaux incluent tous les caractères imprimables et non imprimables qui ne sont pas explicitement spécifiés comme métacaractères. Cela inclut toutes les lettres majuscules et minuscules, tous les chiffres, tous les signes de ponctuation et certains autres symboles.

Caractères non imprimables

Les caractères non imprimables peuvent également faire partie des expressions régulières. Le tableau suivant répertorie les séquences d'échappement représentant les caractères non imprimables :

Caractère Description

cx Correspondances x Le spécifié caractère de contrôle. Par exemple, cM correspond à un caractère Control-M ou à un retour chariot. La valeur de x doit être A-Z ou a-z. Sinon, c est traité comme un caractère « c » littéral.

f correspond à un saut de formulaire. Équivalent à x0c et cL.

n correspond à un caractère de nouvelle ligne. Équivalent à x0a et cJ.

r correspond à un caractère de retour chariot. Équivalent à x0d et cM.

s correspond à n'importe quel caractère d'espacement, y compris les espaces, les tabulations, les sauts de formulaire, etc. Équivalent à [fnrtv].

S correspond à tout caractère autre qu'un espace. Équivalent à [^ fnrtv].

t correspond à un caractère de tabulation. Équivalent à x09 et cI.

v correspond à un caractère de tabulation verticale. Équivalent à x0b et cK.

Caractères spéciaux

Les caractères dits spéciaux sont des caractères ayant une signification particulière, comme le * dans "*.txt" mentionné ci-dessus , en termes simples, signifie la signification de n'importe quelle chaîne. Si vous souhaitez rechercher des fichiers avec * dans le nom de fichier, vous devez échapper au *, c'est-à-dire en ajouter un devant. ls*.txt.

De nombreux métacaractères nécessitent un traitement spécial lorsqu'on essaie de les faire correspondre. Pour faire correspondre ces caractères spéciaux, vous devez d'abord « échapper » les caractères, c'est-à-dire les précéder d'une barre oblique inverse (). Le tableau suivant répertorie les caractères spéciaux dans les expressions régulières :

Caractères spéciaux Description

$ Correspond aux caractères saisis. position finale de la chaîne. Si la propriété Multiline de l'objet RegExp est définie, $ correspond également à « n » ou « r ». Pour faire correspondre le caractère $ lui-même, utilisez $.

( ) Marque le début et la fin d'une sous-expression. Les sous-expressions peuvent être obtenues pour une utilisation ultérieure. Pour faire correspondre ces caractères, utilisez ( et ).

* Correspond à la sous-expression précédente zéro ou plusieurs fois. Pour faire correspondre le caractère *, utilisez *.

+ Correspond à la sous-expression précédente une ou plusieurs fois. Pour faire correspondre le caractère +, utilisez +.

. Correspond à n'importe quel caractère à l'exception du caractère de nouvelle ligne n. Pour faire correspondre ., utilisez .

[ Marque le début d’une expression entre crochets. Pour faire correspondre [, utilisez [.

? Correspond à la sous-expression précédente zéro ou une fois, ou spécifie un qualificatif non gourmand. Pour faire correspondre le caractère ?, utilisez ?.

Marquez le caractère suivant comme un caractère spécial, un caractère littéral, une référence arrière ou un caractère d'échappement octal. Par exemple, « n » correspond au caractère « n ». 'n' correspond à un caractère de nouvelle ligne. La séquence '\' correspond à "", tandis que '(' correspond à "(".

^ correspond au début de la chaîne d'entrée, à moins qu'elle ne soit utilisée dans une expression entre crochets, auquel cas elle indique que le caractère est non accepté Collection. Pour faire correspondre le caractère ^ lui-même, utilisez ^ . Pour faire correspondre |, utilisez |

Qualificateur Le qualificatif

. utilisé pour spécifier qu'un composant donné de l'expression régulière doit apparaître combien de fois pour satisfaire la correspondance ? Il existe 6 types de qualificatifs d'expression régulière : * ou + ou ? ou {n} ou {n,} ou {n, m} 🎜>Caractère Description

* Correspond à la sous-expression précédente zéro ou plusieurs fois. Par exemple, zo* peut correspondre à "z". ". et "zoo". * Équivalent à {0,}.

+ correspond à la sous-expression précédente une ou plusieurs fois. Par exemple, 'zo+' correspond à "zo" et " zoo ", mais ne peut pas correspondre à "z". + Équivalent à {1,}. ? Correspond à la sous-expression précédente zéro ou une fois. Par exemple, "do(es)?" correspond à "do" ou "do" dans "does".? Équivalent à

{n} n est un entier non négatif. Correspond à n fois définies. o' dans "Bob", mais peut correspondre aux deux o dans "food"

.

{n,} n est un entier non négatif. Faites correspondre au moins n fois. Par exemple, "o{2,}" ne correspond pas au "o" de "Bob", mais il correspond à tous les o de "foooood". 'o{1,}' équivaut à 'o+'. 'o{0,}' équivaut à 'o*'.

{n,m} m et n sont tous deux des entiers non négatifs, où n <= m. Faites correspondre au moins n fois et au plus m fois. Par exemple, "o{1,3}" correspondra aux trois premiers o de "fooooood". « o{0,1} » est équivalent à « o ? ». Veuillez noter qu'il ne peut y avoir d'espace entre la virgule et les deux chiffres.

Étant donné que le nombre de chapitres dépassera probablement neuf dans un document d'entrée volumineux, vous avez besoin d'un moyen de gérer les numéros de chapitre à deux ou trois chiffres. Les qualifications vous donnent cette capacité. L'expression régulière suivante fait correspondre les titres de chapitre avec n'importe quel nombre de chiffres :

/Chapter [1-9][0-9]*/

Notez que le qualificatif apparaît après l'expression de plage. Par conséquent, cela s’applique à l’ensemble de l’expression de plage, dans ce cas, uniquement aux nombres de 0 à 9 inclus.

Le qualificatif + n'est pas utilisé ici car il n'est pas nécessairement nécessaire d'avoir un nombre en deuxième position ou en position suivante. Vous ne l'utilisez pas non plus ? caractères car il limite les numéros de chapitre à seulement deux chiffres. Vous devez faire correspondre au moins un chiffre après le chapitre et un espace.

Si vous savez que les numéros de chapitre sont limités à seulement 99 chapitres, vous pouvez utiliser l'expression suivante pour spécifier au moins un mais au plus deux chiffres.

/Chapitre [0-9]{1,2}/

L'inconvénient de l'expression ci-dessus est qu'elle ne correspondra toujours qu'aux numéros de chapitre supérieurs que 99 Les deux premiers chiffres. Un autre inconvénient est que le chapitre 0 correspondra également. Une meilleure expression pour correspondre à seulement deux chiffres serait :

/Chapter [1-9][0-9]?/

ou

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

*, les qualificatifs + et ? sont tous gourmands, puisqu'ils correspondent comme autant de mots que possible, une correspondance non gourmande ou minimale peut être obtenue en ajoutant simplement un ?

Par exemple, vous pouvez rechercher dans un document HTML les titres de chapitre entourés de balises H1. Le texte ressemble à ceci dans votre document :

<H1>Chapitre 1 – Introduction aux expressions régulières</H1>

Les expressions suivantes correspondent à tout du signe d'ouverture inférieur à (<) au signe supérieur à de la balise H1 de fermeture (>).

/<.*>/

Si vous devez uniquement faire correspondre la balise H1 d'ouverture, l'expression "non gourmande" suivante correspond uniquement &Lt ;

/<.*?>/

L'expression passe de « gourmand » à « gourmand » en plaçant après le *, + ou ? Qualificateur Les expressions sont converties en expressions « non gourmandes » ou en correspondances minimales.

localisateur

Le localisateur

vous permet d'épingler une expression régulière au début ou à la fin d'une ligne. Ils vous permettent également de créer des expressions régulières qui apparaissent dans un mot, au début ou à la fin d'un mot. Le localisateur

est utilisé pour décrire la limite d'une chaîne ou d'un mot, ^ et $ font respectivement référence au début et à la fin de la chaîne, b décrit la limite avant ou arrière d'un mot et B représente un limite non-verbale.

Les qualificatifs de l'expression régulière sont :

Caractère Description

^ Correspond à l'entrée caractères La position de départ de la chaîne. Si la propriété Multiline de l'objet RegExp est définie, ^ correspond également à la position après n ou r.

$ Correspond à la fin de la chaîne d'entrée. Si la propriété Multiline de l'objet RegExp est définie, $ correspond également à la position avant n ou r.

b Correspond à une limite de mot, c'est-à-dire la position entre un mot et un espace.

B Correspondance des limites sans mots.

Remarque : les qualificatifs ne peuvent pas être utilisés avec des points d'ancrage. Puisqu'il ne peut y avoir plus d'une position immédiatement avant ou après une nouvelle ligne ou une limite de mot, les expressions telles que ^* ne sont pas autorisées.

Pour faire correspondre le texte au début d'une ligne de texte, utilisez le caractère ^ au début de l'expression régulière. Ne confondez pas cette utilisation de ^ avec l’utilisation d’expressions entre crochets.

Pour faire correspondre le texte à la fin d'une ligne de texte, utilisez le caractère $ à la fin de l'expression régulière.

Pour utiliser des points d'ancrage lors de la recherche de titres de chapitre, l'expression régulière suivante correspond à un titre de chapitre qui ne contient que deux chiffres de fin et apparaît au début de la ligne :

/^ Chapitre [1-9][0-9]{0,1}/

Le véritable titre du chapitre apparaît non seulement au début de la ligne, mais c'est aussi le seul dans la ligne Il y a du texte. Il apparaît à la fois en début et en fin de ligne. L'expression suivante garantit que la correspondance spécifiée correspond uniquement aux chapitres et non aux références croisées. Vous pouvez le faire en créant une expression régulière qui correspond uniquement au début et à la fin d'une ligne de texte.

/^Chapter [1-9][0-9]{0,1}$/

Faire correspondre les limites des mots légèrement différentes, mais vers Regular les expressions ajoutent des capacités importantes. Les limites des mots sont les positions entre les mots et les espaces. Une limite non-verbale est toute autre position. L'expression suivante correspond aux trois premiers caractères du mot Chapitre car ces trois caractères apparaissent après une limite de mot :

/bCha/

b caractères L'emplacement est très important. Il recherche une correspondance au début du mot si elle se trouve au début de la chaîne à rechercher. Si c'est à la fin de la chaîne, il recherche une correspondance à la fin du mot. Par exemple, l'expression suivante correspond à la chaîne ter dans le mot Chapitre car elle apparaît avant une limite de mot :

/terb/

L'expression suivante correspond à la chaîne apt dans Chapter, mais pas à la chaîne apt dans aptitude :

/Bapt/

La chaîne apt apparaît à une limite de mot dans le mot Chapitre, mais à une limite de mot dans le mot aptitude. Pour l'opérateur de limite de non-mot B, la position n'a pas d'importance car la correspondance ne se soucie pas de savoir s'il s'agit du début ou de la fin d'un mot.

Sélectionner

Placez toutes les sélections entre parenthèses et séparez les sélections adjacentes par |. Cependant, l'utilisation de parenthèses aura un effet secondaire, c'est-à-dire que les correspondances associées seront mises en cache. Dans ce cas, vous pouvez utiliser ?: avant la première option pour éliminer cet effet secondaire.

Parmi eux, ?: est l'un des éléments non capturants, et les deux autres éléments non capturants sont ?= et ?!. Ces deux-là ont plus de significations. Le premier est une recherche directe, correspondant à. any start La chaîne de recherche correspond à n'importe quelle position dans le modèle d'expression régulière entre parenthèses, ce qui est une anticipation négative qui correspond à la chaîne de recherche à n'importe quelle position initiale qui ne correspond pas au modèle d'expression régulière.

Références arrières

L'ajout de parenthèses autour d'un modèle d'expression régulière ou d'une partie d'un modèle entraînera le stockage des correspondances associées dans un tampon temporaire, chaque sous-correspondance capturée est stockée dans l'ordre dans lequel elle apparaît dans le modèle d'expression régulière de gauche à droite. La numérotation des tampons commence à 1 et peut stocker jusqu'à 99 sous-expressions capturées. Chaque tampon est accessible à l'aide de « n », où n est un nombre décimal à un ou deux chiffres qui identifie un tampon particulier.

Les captures peuvent être annulées en utilisant les métacaractères non capturants '?:', '?=' ou '?!', en ignorant la sauvegarde des correspondances associées.

L'une des applications les plus simples et les plus utiles des références arrière est la possibilité de trouver des correspondances entre deux mots adjacents identiques dans le texte. Prenons l'exemple de la phrase suivante :

Le coût de l'essence augmente-t-il ?

La phrase ci-dessus comporte évidemment plusieurs mots répétés. Ce serait bien de trouver un moyen de localiser cette phrase sans avoir à chercher les répétitions de chaque mot. L'expression régulière suivante y parvient en utilisant une seule sous-expression :

/b([a-z]+) 1b/gi

expression capturée La formule, comme spécifié par [a-z]+, se compose d'une ou plusieurs lettres. La deuxième partie de l'expression régulière est une référence à une sous-correspondance précédemment capturée, c'est-à-dire la deuxième occurrence du mot correspondant exactement à l'expression entre crochets. 1 spécifie la première sous-correspondance. Les métacaractères de limite de mot garantissent que seuls les mots entiers sont détectés. Sinon, des expressions telles que « est émis » ou « ceci est » ne seront pas correctement reconnues par cette expression.

La balise globale (g) après l'expression régulière indique que l'expression doit être appliquée à autant de correspondances que l'on peut trouver dans la chaîne d'entrée. La balise insensible à la casse (i) à la fin de l'expression spécifie l'insensibilité à la casse. Les balises multilignes spécifient les correspondances potentielles qui peuvent se produire de chaque côté des caractères de nouvelle ligne.

Les références arrière décomposent également un indicateur de ressources universel (URI) en ses composants. Supposons que vous souhaitiez diviser l'URI suivant en protocole (ftp, http, etc.), adresse de domaine et page/chemin :

http://www.w3cschool.cc:80/html/html-tutorial .html

L'expression régulière suivante fournit cette fonctionnalité :

/(w+)://([^/:]+)(:d*)?([^# ]*)/

Premier Le La sous-expression entre crochets capture la partie protocolaire de l’adresse Web. Cette sous-expression correspond à n’importe quel mot précédé de deux points et de deux barres obliques. La deuxième sous-expression entre parenthèses capture la partie adresse de domaine de l'adresse. La sous-expression correspond à un ou plusieurs caractères sauf / et :. La troisième sous-expression entre parenthèses capture le numéro de port (s'il est spécifié). Cette sous-expression correspond à zéro ou plusieurs chiffres après les deux points. Cette sous-expression ne peut être répétée qu'une seule fois. Enfin, la quatrième sous-expression entre parenthèses capture les informations de chemin et/ou de page spécifiées par l'adresse Web. Cette sous-expression correspond à toute séquence de caractères qui n'inclut pas le caractère # ou espace.

En appliquant l'expression régulière à l'URI ci-dessus, chaque sous-correspondance contient les éléments suivants :

1) La première sous-expression entre crochets contient "http"

2) La deuxième sous-expression entre crochets contient "www.w3cschool.cc"

3) La troisième sous-expression entre crochets contient ":80"

4) La quatrième sous-expression entre crochets L'expression contient "../html/html-tutorial.html "

atomes

Les atomes sont les plus petites unités dans les expressions régulières. Pour parler franchement, les atomes doivent correspondre. contenu. Une expression régulière valide doit contenir au moins un atome.

Explication : Les espaces, les retours chariot, les sauts de ligne, 0-9, A-Za-z, le chinois, les signes de ponctuation et les symboles spéciaux que nous voyons sont tous des atomes.

Avant de faire l'exemple atomique, expliquons d'abord une fonction, preg_match :

int preg_match ( string $regular, string $string[, array &$result] )

Fonction : fait correspondre la variable $string basée sur la variable $regular. S'il existe, renvoyez le nombre de correspondances et placez les résultats correspondants dans la variable $result. Si aucun résultat n'est trouvé, 0 est renvoyé.

Début et fin

^ signifie début ; $ signifie fin

Ci-dessous Le code peut correspondre à n'importe quel nombre commençant par date

$str = 'date20150121';

if (preg_match(' /^ date/', $str)) {
echo 'match réussi';
} else {
echo 'match failed';
}

wUtiliser Pour faire correspondre les lettres , des chiffres ou des caractères de soulignement ;

d correspond aux nombres (D signifie non-chiffres) pour représenter

$str = 'date20150121' ;

if (preg_match('/^w/', $str, $matches)) {
print_r($matches);
} else {
echo 'Match échoué';
}

Atomes spécialement identifiés

Atom Description

d Correspond à un 0-9

D tous les caractères sauf 0-9

w a-zA-Z0-9_

W sauf 0-9A - Tous les caractères except -Za-z_

s Correspond à tous les caractères d'espacement n t r Espaces

S Correspond à tous les caractères autres que des espaces

[ ] Spécifie la plage d'atomes

Exemple :

d correspond à un 0-9

<?php
$zz = '/\d/';
$string = '我爱喝9你爱不爱喝';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

D correspond à une valeur autre que 0-9

<?php
$zz = '/\D/';
$string = '121243中23453453';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

Le match est réussi et le match est lancé. Parce que ce n'est pas un caractère entre 0 et 9.

w correspond à a-zA-Z0-9_

<?php
$zz = '/\w/';
$string = '新中_国万岁呀万岁';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

Le match est réussi et le trait de soulignement correspond.

W a fait correspondre une correspondance non-a-zA-Z0-9_

<?php
$zz = '/\w/';
$string = 'afasABCWEQR44231284737';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

a échoué. Parce que tout ce qui précède est a-zA-Z0-9_, et il n'y a rien qui ne soit a-zA-Z0-9_.

s correspond à tous les caractères d'espacement n t r espaces

<?php
$zz = '/\s/';
$string = "中国万
岁";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

correspond avec succès car il y a un retour chariot. Les caractères

S non vides

<?php
$zz = '/\s/';
$string = "        
          a       ";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

correspondent avec succès. Bien qu'il y ait des espaces, des retours chariot et des retraits dessus. Cependant, il existe un caractère non-espace a. Le match est donc réussi.

[] Atomes dans la plage spécifiée

<?php
$zz = '/[0-5]\w+/';
$string = '6a';
$string1 = '1C';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

Conclusion :
Dans l'exemple ci-dessus, 0-5 n'a pas réussi à correspondre à $string, mais $string1 a réussi. Parce que la première valeur de $string est 6, ce qui n'est pas compris dans la plage [0-5].

<?php
$zz = '/[a-zA-Z0-9_]\w/';
$string = 'ab';
$string1 = '9A';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

Conclusion :

$string et $string1 correspondent tous deux avec succès. Parce que w est [a-zA-Z0-9_]

<?php
$zz = '/[abc]\d+/';
$string = 'a9';
$string1 = 'b1';
$string2 = 'c5';
$string3 = 'd4';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

Conclusion :

$string, $string1, $string2 correspondent avec succès, mais $string3 échoue. Étant donné que $string3 dépasse la plage de [abc], il commence à d.

[^ caractère] ne correspond pas aux caractères de la plage spécifiée

<?php
$zz = '/[^0-9A-Za-z_]/';
$string = 'aaaaab311dd';
$string1 = '!$@!#%$#^##';
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

Conclusion :

1) Échec lors de la correspondance avec $string, mais réussi lors de la correspondance avec $string1. Parce qu’il y a un caractère circonflexe à l’intérieur des crochets.

2) ^ La fonction du caractère circonflexe à l'intérieur des crochets n'est pas de faire correspondre les caractères à l'intérieur des crochets.






Formation continue
||
<?php $zz = '/wq/'; $string = 'ssssswqaaaaaa'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
soumettreRéinitialiser le code
  • Recommandations de cours
  • Téléchargement du didacticiel