Expressions régulières - 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, remplacer la sous-chaîne correspondante ou sélectionner parmi une certaine chaîne des sous-chaînes qui. remplir certaines conditions, etc.

  • Lors de la liste des répertoires, *.txt dans le répertoire *.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. Une expression régulière agit comme un 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 :

字符描述
cx匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
f匹配一个换页符。等价于 x0c 和 cL。
n匹配一个换行符。等价于 x0a 和 cJ。
r匹配一个回车符。等价于 x0d 和 cM。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。
S匹配任何非空白字符。等价于 [^ fnrtv]。
t匹配一个制表符。等价于 x09 和 cI。
v匹配一个垂直制表符。等价于 x0b 和 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, qui désigne simplement 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 :

特别字符描述
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,请使用 $。
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
.匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。
[标记一个中括号表达式的开始。要匹配 [,请使用 [。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。
^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。
{标记限定符表达式的开始。要匹配 {,请使用 {。
|指明两项之间的一个选择。要匹配 |,请使用 |。

Qualificateur Le qualificatif

est utilisé pour spécifier combien de fois un composant donné d'une expression régulière doit apparaître pour satisfaire une correspondance. Il existe 6 types : * ou + ou ? ou {n} ou {n,} ou {n,m}.

Les qualificatifs des expressions régulières sont :

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

Étant donné que les numéros de chapitre dépasseront probablement neuf dans les documents 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 correspond aux titres de chapitre numérotés 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.

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

L'inconvénient de l'expression ci-dessus est que les numéros de chapitre supérieurs à 99 ne correspondront toujours qu'aux 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

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

Les qualificatifs *, + et ? sont gourmands dans le sens où ils en trouveront autant que possible pour faire correspondre le texte. , une correspondance non gourmande ou minimale peut être obtenue en ajoutant 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>Chapter 1 – Introduction to Regular Expressions</H1>

L'expression ci-dessous correspond à tout, du signe inférieur d'ouverture (<) au signe supérieur à (>) de la balise H1 de fermeture.

/<.*>/

Si vous devez uniquement faire correspondre la balise d'ouverture H1, l'expression "non gourmande" ci-dessous correspond uniquement à <H1>.

/<.*?>/

En plaçant ? après le qualificatif *, + ou ?, l'expression est convertie d'une expression « gourmande » en une expression « non gourmande » ou une correspondance minimale.

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 des expressions régulières sont :

字符描述
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 n 或 r 之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 n 或 r 之前的位置匹配。
b匹配一个字边界,即字与空格间的位置。
B非字边界匹配。

Remarque  : Vous ne pouvez pas utiliser de qualificatifs 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 :

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

True Non seulement le titre du chapitre apparaît en début de ligne, mais c'est aussi le seul texte de la ligne. 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}$/

Correspond aux limites des mots légèrement différemment, mais ajoute des fonctionnalités importantes aux expressions régulières. 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 La position des caractères b est très importante. 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 Chapter car elle apparaît avant une limite de mot :

/ter\b/

L'expression suivante correspond à la chaîne apt dans Chapter mais pas aux caractères dans aptitude String apt :

/\Bapt/

La chaîne apt apparaît aux limites des mots dans le mot Chapter, mais apparaît aux limites des mots 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 |. Mais 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. 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ère

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 de la correspondance associée dans un tampon temporaire, chaque sous-correspondance étant capturée comme spécifié dans le modèle d'expression régulière. Les expressions sont stockées dans l'ordre dans lequel elles apparaissent 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 spécifique.

Les captures peuvent être remplacées à l'aide des 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 :

Is is the cost of of gasoline going up up?

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 utilise une seule sous-expression pour y parvenir :

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

capture une expression, comme spécifié par [a-z]+, qui comprend 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 décomposer 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*)?([^# ]*)/

First A la sous-expression entre parenthèses 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 suivant les deux points. Cette sous-expression ne peut être répétée qu'une seule fois. Enfin, la quatrième sous-expression entre crochets 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 :

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

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

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

  • La quatrième la sous-expression entre crochets contient "../html/html-tutorial.html"