expression régulière

Que sont exactement les expressions régulières ?

Les caractères constituent l'unité la plus élémentaire lorsque le logiciel informatique traite du texte, qui peut être des lettres, des chiffres, des signes de ponctuation, des espaces, des nouvelles lignes, des caractères chinois, etc. Une chaîne est une séquence de 0 caractères ou plus. Le texte est du texte, une chaîne. Dire qu'une certaine chaîne correspond à une certaine expression régulière signifie généralement qu'une partie (ou plusieurs parties) de la chaîne peut satisfaire aux conditions données par l'expression.

Lors de l'écriture de programmes ou de pages Web qui traitent des chaînes, il est souvent nécessaire de trouver des chaînes qui correspondent à certaines règles complexes. Les expressions régulières sont des outils utilisés pour décrire ces règles. En d’autres termes, les expressions régulières sont des codes qui enregistrent des règles textuelles.

Il est très probable que vous ayez utilisé le caractère générique pour la recherche de fichiers sous Windows/Dos, c'est-à-dire * et ?. Si vous souhaitez rechercher tous les documents Word dans un certain répertoire, vous devez rechercher *.doc. Ici, * sera interprété comme une chaîne arbitraire. Semblables aux caractères génériques, les expressions régulières sont également des outils utilisés pour la correspondance de texte, mais elles peuvent décrire vos besoins avec plus de précision que les caractères génériques - bien sûr, au prix d'être plus compliquées - par exemple, vous pouvez écrire une expression régulière, Utilisé pour tout trouver. des chaînes commençant par 0, suivies de 2-3 chiffres, puis d'un trait d'union "-", et enfin de 7 ou 8 chiffres (comme 010-12345678 ou 0376-7654321).

Démarrage

La meilleure façon d'apprendre les expressions régulières est de commencer par des exemples, puis de modifier et d'expérimenter avec les exemples une fois que vous avez compris eux. Un certain nombre d'exemples simples sont donnés ci-dessous et sont expliqués en détail.

Supposons que vous recherchiez salut dans un roman anglais, vous pouvez utiliser l'expression régulière salut.

C'est presque l'expression régulière la plus simple. Elle peut correspondre avec précision à une chaîne comme celle-ci : elle se compose de deux caractères, le premier caractère est h et le dernier caractère est i. Habituellement, les outils qui traitent les expressions régulières proposent une option permettant d'ignorer la casse. Si cette option est sélectionnée, elle peut correspondre à l'un des quatre cas hi, HI, Hi et hI.

Malheureusement, de nombreux mots contiennent les deux caractères consécutifs salut, comme lui, histoire, haut, etc. Si vous utilisez hi pour effectuer une recherche, le salut à l'intérieur sera également trouvé. Si nous voulons trouver le mot hi avec précision, nous devons utiliser bhib.

b est un code spécial spécifié par une expression régulière (enfin, certaines personnes l'appellent un métacaractère), qui représente le début ou la fin d'un mot, qui est la limite d'un mot. Bien que les mots anglais soient généralement séparés par des espaces, des signes de ponctuation ou des nouvelles lignes, b ne correspond à aucun de ces caractères de séparation de mots, il ne correspond qu'à une seule position.

Si vous avez besoin d'être plus précis, b correspond à une position où le caractère avant et après n'est pas les deux (l'un l'est, l'autre n'est pas ou n'existe pas) w.

Si ce que vous recherchez est salut suivi d'une Lucy non loin, vous devriez utiliser bhib.*bLucyb.

Ici, . est un autre métacaractère, correspondant à n'importe quel caractère à l'exception des caractères de nouvelle ligne. * est également un métacaractère, mais il ne représente ni un caractère, ni une position, mais une quantité - il spécifie que le contenu avant * peut être utilisé de manière répétée un nombre illimité de fois pour faire correspondre l'expression entière. Par conséquent, .* ensemble signifie n’importe quel nombre de caractères n’incluant pas de nouvelle ligne. Maintenant, la signification de bhib.*bLucyb est évidente : d'abord le mot salut, puis un nombre quelconque de caractères (mais pas de nouvelles lignes), et enfin le mot Lucy.

Le caractère de nouvelle ligne est 'n', le caractère avec le codage ASCII 10 (hexadécimal 0x0A).

Si d'autres métacaractères sont utilisés ensemble, nous pouvons construire des expressions régulières plus puissantes. Par exemple, l'exemple suivant :

0dd-dddddddd correspond à une chaîne qui commence par 0, puis deux chiffres, puis un trait d'union "-", et enfin 8 chiffres (c'est-à-dire des numéros de téléphone chinois. Bien sûr , cet exemple ne peut correspondre qu'à la situation où l'indicatif régional est composé de 3 chiffres).

Le d ici est un nouveau métacaractère, correspondant à un seul chiffre (0, ou 1, ou 2, ou...). - n'est pas un métacaractère, il correspond seulement à lui-même - le trait d'union (ou le signe moins, ou le trait d'union, ou peu importe comment vous voulez l'appeler).

Afin d'éviter tant de répétitions gênantes, on peut aussi écrire cette expression comme ceci : 0d{2}-d{8}. Le {2} ({8}) après d signifie ici que le d précédent doit être répété et mis en correspondance 2 fois (8 fois) de suite.

Test des expressions régulières

Autres outils de test disponibles :

RegexBuddy

Outil de test en ligne des expressions régulières Javascript

Si vous ne trouvez pas les expressions régulières difficiles à lire et à écrire, soit vous êtes un génie, soit vous n'êtes pas de la Terre. La syntaxe des expressions régulières peut prêter à confusion, même pour les personnes qui l'utilisent régulièrement. Parce qu’elles sont difficiles à lire et à écrire et sujettes aux erreurs, il est nécessaire de trouver un outil pour tester les expressions régulières.

Certains détails des expressions régulières sont différents selon les environnements. Ce tutoriel présente le comportement des expressions régulières sous Microsoft .Net Framework 2.0, je vais donc vous présenter un outil sous .Net Regex Tester. Assurez-vous d’abord que .Net Framework 2.0 est installé, puis téléchargez Regex Tester. Il s'agit d'un logiciel vert Après le téléchargement, ouvrez le package compressé et exécutez directement RegexTester.exe.

Ce qui suit est une capture d'écran de Regex Tester en cours d'exécution :

QQ截图20161010113044.png


Métacaractères

Vous connaissez déjà quelques métacaractères utiles, tels que b,.,* et d. Il existe davantage de métacaractères dans les expressions régulières, tels que s correspondant à n'importe quel caractère d'espacement, y compris les espaces, la tabulation, la nouvelle ligne et le chinois pleine largeur. espaces, etc w correspond à des lettres, des chiffres, des traits de soulignement ou des caractères chinois, etc.

Le traitement spécial des caractères chinois/chinois est pris en charge par le moteur d'expression régulière fourni par .Net. Pour plus de détails dans d'autres environnements, veuillez consulter les documents pertinents.

Voici quelques exemples supplémentaires :

baw*b correspond aux mots commençant par la lettre a - d'abord le début d'un mot (b), puis la lettre a, puis n'importe quel nombre de lettres ou chiffres (w*), suivis de la fin du mot (b).

Bon, parlons maintenant de ce que signifient les mots dans l'expression régulière : pas moins d'un w consécutif. Oui, cela n'a vraiment pas grand-chose à voir avec les milliers de choses portant le même nom que vous devez mémoriser pour apprendre l'anglais :)

d+ correspond à 1 ou plusieurs nombres consécutifs. Le + ici est un métacaractère similaire à *, la différence est que * correspond à un nombre répété de fois (éventuellement 0 fois), tandis que + correspond à une répétition 1 ou plusieurs fois.

bw{6}b correspond à un mot d'exactement 6 caractères.

Tableau 1. Métacaractères couramment utilisés

QQ截图20161010113058.png

Les moteurs d'expressions régulières fournissent généralement des méthodes "tester si la chaîne spécifiée correspond à une expression régulière", telles que RegExp Méthode .test() en JavaScript ou méthode Regex.IsMatch() en .NET. La correspondance ici fait référence à la question de savoir s'il existe une partie de la chaîne qui est conforme aux règles d'expression. Si ^ et $ ne sont pas utilisés, pour d{5,12}, l'utilisation de cette méthode ne peut garantir que la chaîne contient 5 à 12 chiffres consécutifs, plutôt que la chaîne entière soit de 5 à 12 chiffres.

Les métacaractères ^ (le symbole sur la même touche que le chiffre 6) et $ correspondent tous deux à une position, qui est quelque peu similaire à b. ^ correspond au début de la chaîne que vous recherchez et $ correspond à la fin. Ces deux codes sont très utiles lors de la vérification du contenu saisi. Par exemple, si un site Web exige que le numéro QQ que vous remplissez soit composé de 5 à 12 chiffres, vous pouvez utiliser : ^d{5,12}$.

Le {5,12} ici est similaire au {2} introduit précédemment, sauf que le match {2} ne peut être répété que deux fois, ni plus, ni moins, et {5,12} est répété . Le nombre ne peut pas être inférieur à 5 fois et ne peut pas être supérieur à 12 fois, sinon il ne correspondra pas.

Parce que ^ et $ sont utilisés, la chaîne d'entrée entière doit être utilisée pour correspondre à d{5,12}, ce qui signifie que l'entrée entière doit être composée de 5 à 12 nombres, donc si l'entrée Si le numéro QQ peut correspondre à cette expression régulière, il répond aux exigences.

Semblable à l'option permettant d'ignorer la casse, certains outils de traitement d'expressions régulières ont également la possibilité de traiter plusieurs lignes. Si cette option est sélectionnée, la signification de ^ et $ devient le début et la fin de la ligne correspondante.

Évasion de personnage

Si vous souhaitez rechercher les métacaractères eux-mêmes, comme ., ou *, il y a un problème : vous ne pouvez pas les spécifier, car ils seront interprétés comme autre chose. A ce moment, vous devez utiliser pour annuler la signification particulière de ces caractères. Par conséquent, vous devez utiliser . Bien sûr, pour rechercher lui-même, vous devez également utiliser \.

Par exemple : deerchao.net correspond à deerchao.net, C:\Windows correspond à C:Windows.

Répéter

Vous avez déjà vu les répétitions correspondantes précédentes de la manière *, +, {2}, {5,12}. Voici tous les qualificatifs dans les expressions régulières (nombre spécifié de codes, tels que *, {5,12}, etc.) :

Tableau 2. Qualificateurs couramment utilisés

QQ截图20161010113118.png

Voici quelques exemples d'utilisation de la répétition :

Windowsd+ correspond à Windows suivi d'un ou plusieurs chiffres

^w+ correspond au premier mot d'une ligne (ou à la chaîne entière Le premier mot de, la signification spécifique correspondante dépend des paramètres d'option)

Classe de caractères

Pour trouver des chiffres, des lettres ou des chiffres, les espaces sont faciles car il existe déjà des métacaractères correspondant à ces jeux de caractères, mais que se passe-t-il si vous souhaitez faire correspondre un jeu de caractères qui n'a pas de métacaractères prédéfinis (comme les voyelles a, e, i, o, u) ?

C'est très simple, il vous suffit de les lister entre crochets, comme [aeiou] correspond à n'importe quelle voyelle anglaise, [.?!] correspond aux signes de ponctuation (. ou ? ou !) .

Nous pouvons également facilement spécifier une plage de caractères. Par exemple, [0-9] représente exactement la même signification que d : un seul chiffre de la même manière, [a-z0-9A-Z_] est également complètement équivalent ; . en w (si seul l'anglais est pris en compte).

Ce qui suit est une expression plus complexe : (?0d{2}[) -]?d{8}.

"(" et ")" sont également des métacaractères, qui seront mentionnés plus tard dans la section de regroupement, ils doivent donc être échappés ici.

Cette expression peut correspondre à des numéros de téléphone dans plusieurs formats, tels que (010)88886666, ou 022-22334455, ou 02912345678, etc. Faisons une analyse dessus : il y a d'abord un caractère d'échappement (, il peut apparaître 0 ou 1 fois (?), puis un 0, suivi de 2 chiffres (d{2}), puis) ​​ou - Ou un des espaces , qui apparaît 1 fois ou non (?), et enfin 8 chiffres (d{8}).

État de la succursale

Malheureusement, l'expression peut également correspondre à "Non" comme 010)12345678 ou (022-87654321 "Correct" format.Pour résoudre ce problème, nous devons utiliser des conditions de branchement. Les conditions de branchement dans les expressions régulières font référence à plusieurs règles. Si l'une de ces règles est remplie, elle doit être considérée comme une correspondance. des règles différentes. Vous ne comprenez pas ? Cela n'a pas d'importance. Regardez l'exemple :

0d{2}-d{8}|0d{3}-d{7} peut correspondre à deux types. numéros séparés par des tirets : l'un est un indicatif régional à trois chiffres et un numéro local à huit chiffres (tel que 010-12345678), et l'autre est un indicatif régional à quatre chiffres et un numéro local à sept chiffres (0376-2233445).

(0d{2})[- ]?d{8}|0d{2}[- ]?d{8} Cette expression correspond à un numéro de téléphone avec un indicatif régional à 3 chiffres, où l'indicatif régional peut être entre parenthèses, il n'est pas nécessaire de l'utiliser. L'indicatif régional et l'indicatif local peuvent être séparés par un trait d'union ou un espace, ou il ne peut y avoir aucune séparation. Vous pouvez essayer d'utiliser des conditions de branche pour étendre cette expression afin de prendre également en charge les indicatifs régionaux à 4 chiffres.

d{5}-d{4}|d{5} est une expression utilisée pour correspondre aux codes postaux aux États-Unis. La règle pour les codes postaux américains est de 5 chiffres, ou 9 chiffres séparés par des tirets. La raison pour laquelle cet exemple est donné est qu'il peut illustrer un problème : lorsque vous utilisez des conditions de branchement, faites attention à l'ordre de chaque condition. Si vous le remplacez par d{5}|d{5}-d{4}, seuls les codes postaux à 5 chiffres (et les 5 premiers chiffres des codes postaux à 9 chiffres) seront mis en correspondance. La raison en est que lors de la correspondance des conditions de branche, chaque condition sera testée de gauche à droite. Si une certaine branche est satisfaite, les autres conditions ne seront pas prises en compte.

Regroupement

Nous avons déjà évoqué comment répéter un seul caractère (ajoutez simplement le qualificatif directement après le personnage mais si vous le souhaitez) ; Que faire si plusieurs caractères sont répétés ? Vous pouvez utiliser des parenthèses pour spécifier une sous-expression (également appelée regroupement), puis vous pouvez spécifier le nombre de répétitions de cette sous-expression. Vous pouvez également effectuer d'autres opérations sur la sous-expression (qui seront présentées plus tard).

(d{1,3}.){3}d{1,3} est une simple expression de correspondance d'adresse IP. Pour comprendre cette expression, analysez-la dans l'ordre suivant : d{1,3} correspond à un nombre de 1 à 3 chiffres, (d{1,3}.){3} correspond à un nombre à trois chiffres plus un point (ce Le tout est ce groupe) répété trois fois, et enfin un nombre à trois chiffres (d{1,3}) est ajouté.

Aucun des nombres contenus dans une adresse IP ne peut être supérieur à 255. Ne vous laissez pas tromper par les scénaristes de la saison 3 de "24"...

Malheureusement, cela correspondra également 256.300 Une adresse IP telle que .888.999 qui ne peut pas exister. Si vous pouvez utiliser la comparaison arithmétique, vous pourrez peut-être résoudre ce problème simplement, mais les expressions régulières ne fournissent aucune fonction mathématique, vous ne pouvez donc utiliser que de longues classes de regroupement, de sélection et de caractères pour décrire une adresse IP correcte :( (2 [0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd? ).

La clé pour comprendre cette expression est de comprendre 2[0-4]d|25[0-5]|[01]?dd?, je n'entrerai pas dans les détails ici, vous devriez pouvoir pour l'analyser vous-même, faites ressortir sa signification.

Antonyme

Parfois, il est nécessaire de trouver des caractères qui n'appartiennent pas à une classe de caractères facilement définie. Par exemple, si vous souhaitez rechercher un caractère autre que des chiffres, vous devez utiliser l'antonyme :

Tableau 3. Codes d'antonymes couramment utilisés


QQ截图20161010113135.png

Référence arrière

Après avoir utilisé des parenthèses pour spécifier une sous-expression, le texte correspondant à cette sous-expression (c'est-à-dire le contenu capturé par ce groupe) peut être traité davantage dans l'expression ou dans d'autres programmes. Par défaut, chaque groupe aura automatiquement un numéro de groupe. La règle est la suivante : de gauche à droite, avec le crochet gauche du groupe comme marque, le numéro de groupe du premier groupe apparaissant est 1, le deuxième est 2, et ainsi de suite.

Euh... En fait, l'attribution des numéros de groupe n'est pas aussi simple que je viens de le dire :

Le groupe 0 correspond à l'expression régulière entière

En fait, le numéro de groupe Le processus d'attribution est Il doit être scanné deux fois de gauche à droite : le premier passage n'attribue qu'à des groupes sans nom, le deuxième passage n'attribue qu'à des groupes nommés - donc les numéros de groupe de tous les groupes nommés sont supérieurs aux numéros de groupe sans nom

Vous pouvez utiliser une syntaxe telle que (?:exp) pour priver un groupe du droit de participer à l'attribution de numéros de groupe.

La référence arrière est utilisée pour rechercher à plusieurs reprises le texte correspondant à un groupe précédent. Par exemple, 1 représente le texte correspondant au groupe 1. Difficile à comprendre ? Veuillez consulter l'exemple :

b(w+)bs+1b peut être utilisé pour faire correspondre des mots répétés, comme go go ou kitty kitty. Cette expression est d'abord un mot, c'est-à-dire plus d'une lettre ou un chiffre (b(w+)b) entre le début et la fin du mot. Ce mot sera capturé dans le groupe numéroté 1, puis 1. Un ou plusieurs espaces. caractères (s+), et enfin le contenu capturé dans le groupe 1 (c'est-à-dire le mot précédemment correspondant) (1).

Vous pouvez également spécifier vous-même le nom de groupe de la sous-expression. Pour spécifier le nom de groupe d'une sous-expression, veuillez utiliser la syntaxe suivante : (?<Mot>w+) (ou remplacez les crochets angulaires par ': (?'Mot'w+)), afin que le nom de groupe de w+ Le nom est désigné comme Word. Pour rétro-référencer le contenu capturé par ce groupe, vous pouvez utiliser k<Word>, donc l'exemple précédent pourrait également être écrit comme ceci : b(?<Word>w+)bs+k<Word>b.

Lors de l'utilisation de parenthèses, il existe de nombreuses syntaxes spéciales. Certaines des plus couramment utilisées sont répertoriées ci-dessous :

Tableau 4. Syntaxe de regroupement courante

QQ截图20161010113211.png

Assertion de largeur nulle

Peuples sur terre, pensez-vous que ces termes et noms sont trop compliqués et difficiles à retenir ? Je ressens la même chose. Sachez simplement qu'une telle chose existe, comment ça s'appelle, laissez tomber ! Si la personne n'a pas de nom, elle peut se concentrer sur la pratique de l'épée ; si l'objet n'a pas de nom, elle peut choisir à volonté...

Les quatre suivants servent à retrouver avant ou après certains contenus (mais pas y compris ce contenu) Les choses, c'est-à-dire qu'elles sont utilisées comme b,^,$ pour spécifier une position qui doit satisfaire certaines conditions (c'est-à-dire des assertions), elles sont donc également appelées assertions de largeur nulle. Il est préférable d'utiliser un exemple pour illustrer :

L'assertion est utilisée pour déclarer un fait qui devrait être vrai. La correspondance dans les expressions régulières ne continue que lorsque l'assertion est vraie.

(?=exp) est également appelée assertion prospective positive de largeur nulle. Elle affirme que l'expression exp peut être mise en correspondance après la position où elle apparaît. Par exemple, bw+(?=ingb) correspond à la partie avant d'un mot se terminant par ing (autre que ing). Par exemple, lorsque vous recherchez Je chante pendant que vous dansez., cela correspondra à chanter et à danser.

(?<=exp) est également appelée assertion post-lookback positive de largeur nulle. Elle affirme que la position avant elle-même peut correspondre à l'expression exp. Par exemple, (?<=bre)w+b correspondra à la seconde moitié du mot commençant par re (autre que re). Par exemple, lors d'une recherche pour lire un livre, cela correspond à ading.

Si vous souhaitez ajouter une virgule entre tous les trois chiffres dans un nombre très long (ajouté depuis la droite, bien sûr), vous pouvez trouver la partie qui doit être précédée et ajoutée d'une virgule comme ceci : ((( ?<=d)d{3})+b, lorsqu'il est utilisé pour rechercher 1234567890, le résultat est 234567890.

L'exemple suivant utilise les deux assertions : (?<=s)d+(?=s) correspond aux nombres séparés par des caractères d'espacement (encore une fois, ces caractères d'espacement ne sont pas inclus).

Assertion négative de largeur nulle

Nous avons mentionné plus tôt comment trouver des caractères qui ne sont pas un certain caractère ou qui ne appartiennent pas à une certaine classe de caractères méthode (antonyme). Mais que se passe-t-il si nous voulons simplement nous assurer qu'un certain caractère n'apparaît pas, mais que nous ne voulons pas lui correspondre ? Par exemple, si nous voulons trouver un mot dans lequel la lettre q apparaît, mais q n'est pas suivi de la lettre u, nous pouvons essayer ceci :

bw*q[^u]w*b correspond au contenant des mots suivis de la lettre q qui n'est pas la lettre u. Mais si vous faites plus de tests (ou si votre réflexion est suffisamment fine, vous pouvez l'observer directement), vous constaterez que si q apparaît à la fin d'un mot, comme Irak, Benq, cette expression tournera mal. En effet, [^u] correspond toujours à un caractère, donc si q est le dernier caractère du mot, le [^u] suivant correspondra au séparateur de mot après q (qui peut être un espace, un point ou autre Quoi), le w*b suivant correspondra au mot suivant, donc bw*q[^u]w*b peut correspondre à l'ensemble des combats en Irak. Une assertion négative de largeur nulle peut résoudre ce problème car elle ne correspond qu'à une seule position et ne consomme aucun caractère. Maintenant, nous pouvons résoudre ce problème comme ceci : bw*q(?!u)w*b.

L'assertion d'anticipation négative de largeur nulle (?!exp), affirme que l'expression exp ne peut pas être mise en correspondance après cette position. Par exemple : d{3}(?!d) correspond à trois chiffres, et ces trois chiffres ne peuvent pas être suivis de nombres ; b((?!abc)w)+b correspond à des mots qui ne contiennent pas la chaîne continue abc.

De même, nous pouvons utiliser (?<!exp), une assertion rétrospective négative de largeur nulle pour affirmer que la position précédente ne peut pas correspondre à l'expression exp : (?<![a-z])d{ 7 } correspond à un nombre à sept chiffres qui n'est pas précédé d'une lettre minuscule.

Veuillez analyser l'expression (?<=<(w+)>).*(?=</1>) en détail. Cette expression exprime le mieux le véritable objectif de l'assertion de largeur nulle.

Un exemple plus complexe : (?<=<(w+)>).*(?=</1>) correspond au contenu d'une simple balise HTML qui ne contient pas d'attributs. (<?(w+)>) spécifie un préfixe : un mot entouré de crochets (par exemple, il peut s'agir de <b>), puis .* (une chaîne arbitraire) et enfin un suffixe (? =< ;/1>). Faites attention au / dans le suffixe, qui utilise le caractère d'échappement mentionné précédemment ; 1 est une référence arrière, qui fait référence au premier groupe capturé, le contenu correspond au précédent (w+), donc si le préfixe est réellement If <b>, le suffixe est </b>. L'expression entière correspond au contenu entre <b> et </b> (encore une fois, sans compter le préfixe et le suffixe lui-même).

Commentaires

Une autre utilisation des parenthèses consiste à inclure des commentaires via la syntaxe (?#comment). Par exemple : 2[0-4]d(?#200-249)|25[0-5](?#250-255)|[01]?dd?(?#0-199).

Si vous souhaitez inclure des commentaires, il est préférable d'activer l'option "Ignorer les caractères d'espacement dans le motif", afin que vous puissiez ajouter arbitrairement des espaces, des tabulations et des nouvelles lignes lors de l'écriture d'expressions, mais ceux-ci seront ignorés dans utilisation réelle. Lorsque cette option est activée, tout le texte suivant le # jusqu'à la fin de la ligne sera ignoré en tant que commentaire. Par exemple, on peut écrire l'expression précédente comme ceci :

     (?<=    # 断言要匹配的文本的前缀
      <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?=     # 断言要匹配的文本的后缀
      <\/>  # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
      )       # 后缀结束

Cupidité et paresse

Lorsque l'expression régulière contient répété Lors de la spécification d'un qualificatif , le comportement habituel consiste à faire correspondre autant de caractères que possible (tout en permettant la correspondance de l'expression entière). Prenons cette expression comme exemple : a.*b, elle correspondra à la chaîne la plus longue commençant par a et se terminant par b. Si vous l'utilisez pour rechercher aabab, il correspondra à la chaîne entière aabab. C’est ce qu’on appelle le matching gourmand.

Parfois, nous avons besoin d'une correspondance paresseuse, c'est-à-dire de faire correspondre le moins de caractères possible. Les qualificatifs donnés ci-dessus peuvent être convertis en modèles de correspondance paresseux en ajoutant un point d'interrogation après eux. De cette façon, .*? signifie faire correspondre n'importe quel nombre de répétitions, mais en utilisant le moins de répétitions possible pour que la correspondance entière soit réussie. Regardez maintenant la version paresseuse de l'exemple :

a.*?b correspond à la chaîne la plus courte commençant par a et se terminant par b. Si vous l'appliquez à aabab, il correspondra à aab (du premier au troisième caractère) et ab (du quatrième au cinquième caractère).

Pourquoi la première correspondance est-elle aab (du premier au troisième caractère) au lieu de ab (du deuxième au troisième caractère) ? En termes simples, car les expressions régulières ont une autre règle qui a une priorité plus élevée que la règle paresseuse/gourmande : la correspondance qui commence le plus tôt a la priorité la plus élevée : la correspondance qui commence le plus tôt gagne.

Tableau 5. Qualificateurs paresseux

QQ截图20161010113322.png

Options de traitement

En C#, vous pouvez utiliser le constructeur Regex(String, RegexOptions) pour définir les options de traitement des expressions régulières. Par exemple : Regex regex = new Regex (@"baw{6}b", RegexOptions.IgnoreCase);

Ce qui précède présente plusieurs options telles que l'ignorance de la casse, le traitement de plusieurs lignes, etc. Ces options peuvent être utilisées changer Comment gérer les expressions régulières. Voici les options d'expression régulière couramment utilisées dans .Net :

Tableau 6. Options de traitement couramment utilisées

QQ截图20161010113340.png

Une question fréquemment posée est : Oui, n'est-ce pas ? Est-il possible d'utiliser simultanément un seul mode multiligne et un seul mode ? La réponse est : non. Il n’y a aucune relation entre ces deux options, sauf que leurs noms sont similaires au point de prêter à confusion.

Groupe équilibré/correspondance récursive

La syntaxe de groupe équilibré présentée ici n'est pas nécessairement prise en charge par d'autres langages/bibliothèques ; le prendre en charge Cette fonctionnalité peut être prise en charge mais nécessite une syntaxe différente.

Parfois, nous devons faire correspondre une structure hiérarchique emboîtable comme (100 * (50 + 15)). Dans ce cas, utiliser simplement (.+) ne fera correspondre que le crochet le plus à gauche et le contenu entre la fermeture la plus à droite. parenthèses (nous discutons ici du mode gourmand, le mode paresseux présente également les problèmes suivants). Si le nombre d'occurrences du crochet gauche et du crochet droit dans la chaîne d'origine n'est pas égal, comme (5 / (3 + 2))), alors le nombre des deux dans notre résultat de correspondance ne sera pas égal. Existe-t-il un moyen de faire correspondre le contenu le plus long et correspondant entre parenthèses dans une telle chaîne ?

Afin d'éviter ( et ( de confondre complètement votre cerveau, utilisons des crochets angulaires au lieu de crochets. Maintenant, notre question devient comment remplacer xx <aa <bbb> <bbb> Dans une chaîne comme aa> yy, le contenu à l'intérieur du crochet angulaire le plus long est capturé

La structure syntaxique suivante doit être utilisée ici :

(?'group') Le contenu capturé est nommé groupe et poussé dans la pile (Stack)

(?'-group') Extrait de la pile le contenu capturé nommé groupe qui a été poussé pour la dernière fois sur la pile. Si la pile est vide à l'origine, alors la correspondance de ce groupe. échoué

(?(group)yes|no) S'il y a un contenu capturé nommé groupe sur la pile, continuez à faire correspondre l'expression de la partie oui, sinon continuez à faire correspondre la partie non

(?!) Assertion d'anticipation négative de largeur nulle, puisqu'il n'y a pas d'expression de suffixe, essayer de faire correspondre échoue toujours

Si vous n'êtes pas un programmeur (ou si vous vous appelez programmeur mais ne savez pas ce qu'est un pile est), vous pouvez comprendre les trois syntaxes ci-dessus comme ceci : la première consiste à écrire un "groupe" sur le tableau, la seconde consiste à effacer un "groupe" du tableau et la troisième consiste à lire ce qui est écrit dessus. le tableau noir. S'il n'y a pas de "groupe", continuez à faire correspondre la partie oui, sinon faites correspondre la partie non.

Ce que nous devons faire est d'appuyer sur un "Open" à chaque fois que nous rencontrons un support gauche, d'en afficher un à chaque fois que nous rencontrons un support droit, et à la fin de vérifier si la pile est vide - si elle n'est pas vide. , alors cela prouve qu'il y a plus de parenthèses gauches que de parenthèses droites, donc la correspondance devrait échouer. Le moteur d'expression régulière fera marche arrière (supprimera certains des premiers ou derniers caractères) et tentera de faire correspondre l'expression entière.

<                         #最外层的左括号
    [^<>]*                #最外层的左括号后面的不是括号的内容
    (
        (
            (?'Open'<)    #碰到了左括号,在黑板上写一个"Open"
            [^<>]*       #匹配左括号后面的不是括号的内容
        )+
        (
            (?'-Open'>)   #碰到了右括号,擦掉一个"Open"
            [^<>]*        #匹配右括号后面不是括号的内容
        )+
    )*
    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败
>                         #最外层的右括号

L'une des applications les plus courantes des groupes équilibrés consiste à faire correspondre le HTML. L'exemple suivant peut faire correspondre les balises <div> ]*(((?'Ouvrir'<div[^>]*>)[^<>]*)+((?'-Ouvrir'</div>)[^<> ]*)+)*(?(Open)(?!))</div>.

Il y a autre chose qui n'est pas mentionné

Un grand nombre d'éléments permettant de construire des expressions régulières ont été décrits ci-dessus, mais il reste encore beaucoup de choses qui n'ont pas été mentionnées. Vous trouverez ci-dessous une liste de quelques éléments non mentionnés, avec une syntaxe et des explications simples. Vous pouvez trouver des références plus détaillées en ligne pour en savoir plus lorsque vous devez les utiliser. Si vous avez installé la bibliothèque MSDN, vous pouvez également trouver une documentation détaillée sur les expressions régulières sous .net.

L'introduction ici est très brève. Si vous avez besoin d'informations plus détaillées et que la bibliothèque MSDN n'est pas installée sur votre ordinateur, vous pouvez consulter la documentation en ligne MSDN sur les éléments du langage d'expression régulière.

Tableau 7. Syntaxe pas encore discutée en détail

QQ截图20161010113405.png

Formation continue
||
<?php echo "Hello world"; ?>
soumettreRéinitialiser le code
  • Recommandations de cours
  • Téléchargement du didacticiel