La partie la plus importante est les concepts. Une fois que vous comprenez comment les blocs de construction de travail, les différences de syntaxe à peine plus que doux dialectes. Une couche sur le dessus de votre moteur d'expression régulière de la syntaxe est la syntaxe du langage de programmation que vous utilisez. Des langages tels que Perl enlever la plupart de cette complication, mais vous devez garder à l'esprit que d'autres considérations si vous utilisez des expressions régulières dans un programme C.
Si vous pensez que des expressions régulières comme les blocs de construction que vous pouvez mélanger et assortir comme vous s'il vous plaît, il vous aide à apprendre à écrire et déboguer vos propres motifs, mais aussi la façon de comprendre les modèles écrits par d'autres.
Commencer simple
Sur le plan conceptuel, la plus simple des expressions régulières sont des caractères littéraux. Le modèle N
correspond au caractère 'N'.
Les expressions régulières uns à côté des autres séquences de match. Par exemple, le motif Nick
correspond à la séquence " N "suivi par" i "suivi d'un" c "suivi par "k".
Si vous avez déjà utilisé l' grep
sur Unix, même si seulement pour une recherche simple, la recherche des chaînes,-vous avez déjà été en utilisant des expressions régulières! ( re
En grep
fait référence à des expressions régulières.)
Commande à partir du menu
En ajoutant juste un peu de complexité, vous pouvez faire correspondre soit "Pseudo" ou "pseudo" avec le motif [Nn]ick
. La partie entre crochets est une classe de caractères, ce qui signifie qu'il correspond exactement à l'un des caractères entourés. Vous pouvez également utiliser des plages dans les classes de caractères, de sorte [a-c]
correspond 'a' ou 'b' ou 'c'.
Le modèle .
est spécial: plutôt que de correspondance littérale point seulement, il correspond à tout caractère†. C'est la même chose sur le plan conceptuel que le gros de la classe de caractères [-.?+%$A-Za-z0-9...]
.
Pensez à des classes de caractère que les menus: en choisir qu'un.
Raccourcis utiles
À l'aide de .
peut vous faire économiser beaucoup de frappe, et il y a d'autres raccourcis pour les modèles communs. Dites que vous souhaitez faire correspondre des nombres entiers non négatifs: une façon de l'écrire c'est - [0-9]+
. Les chiffres sont souvent identiques à la cible, de sorte que vous pouvez utiliser \d+
match entiers non négatifs. D'autres sont \s
(whitespace) et \w
(mot de caractères: caractères alphanumériques ou tiret).
L'en majuscule variantes sont leurs compléments, alors \S
correspond à n'importe quel non-blanc, par exemple.
Une fois n'est pas assez
À partir de là, vous pouvez répéter les pièces de votre modèle avec des quantificateurs. Par exemple, le motif ab?c
correspond à " abc " ou "ac", car l' ?
quantificateur rend le sous-masque, il modifie en option. D'autres quantificateurs sont
-
*
(zéro ou plusieurs fois)
-
+
(une fois ou plus)
-
{n}
(exactement n fois)
-
{m,n}
(au moins m fois, mais pas plus de n fois)
Mettre quelques-uns de ces blocs ensemble, le schéma [Nn]*ick
correspond à l'ensemble des
- ick
- Nick
- nick
- Nnick
- nNick
- nnick
- (et ainsi de suite)
Le premier match démontre une leçon importante: *
réussit toujours! N'importe quel modèle peut correspondre à zéro fois.
Groupement
Un quantificateur modifie le modèle à sa gauche immédiate. Vous vous en doutez 0abc+0
de match, 0abc0', '0abcabc0', et ainsi de suite, mais le modèle immédiatement à la gauche de la plus quantificateur est - c
. Cela signifie 0abc+0
des matchs 0abc0', '0abcc0', '0abccc0', et ainsi de suite.
Pour correspondre à un ou plusieurs séquences de " abc " avec des zéros sur les extrémités, utilisez 0(abc)+0
. Les parenthèses indiquent un sous-masque, qui peut être quantifiée comme une unité. Il est également fréquent pour moteurs d'expressions régulières pour enregistrer ou de "capturer" la partie de l'entrée de texte qui correspond à une mise entre parenthèses du groupe. L'extraction de bits de cette manière est beaucoup plus souple et moins sujette à erreur que de compter sur des indices et des substr
.
L'alternance
Plus tôt, nous avons vu un moyen de faire correspondre soit "Pseudo" ou "pseudo". Un autre est à l'alternance comme en Nick|nick
. Rappelez-vous que l'alternance comprend tout à gauche et tout à droite. L'utilisation de regroupement des parenthèses pour limiter la portée de l' |
, par exemple, (Nick|nick)
.
Pour un autre exemple, vous pourriez écrire de manière équivalente [a-c]
comme a|b|c
, mais cela est susceptible d'être sous-optimale en raison de nombreuses implémentations assumer des solutions de rechange ont des longueurs de plus de 1.
S'échapper
Bien que certains caractères eux-mêmes, d'autres ont des significations particulières. Le modèle \d+
ne correspond pas à antislash suivi d'minuscule D suivi par un signe plus: pour l'obtenir, nous utiliserions \\d\+
. Une barre oblique inverse supprime la signification spéciale du caractère suivant.
La cupidité
Expression régulière quantificateurs sont gourmands. Cela signifie qu'ils correspondent à autant de texte qu'ils le peuvent, tout en permettant à l'ensemble du motif pour correspondre avec succès.
Par exemple, dire que l'entrée est
"Bonjour," dit-elle, "Comment allez-vous?"
Vous vous en doutez ".+"
de match seulement "Bonjour", et ensuite être surpris, quand vous voyez qu'elle correspondait à partir de "Bonjour" à tout le chemin à travers " vous?".
Pour passer de l'gourmand à ce qu'on pourrait penser que la prudence, d'ajouter un extra - ?
pour le quantificateur. Maintenant, vous comprenez combien de \((.+?)\)
, à l'exemple de votre question œuvres. Elle correspond à la séquence d'un littéral de gauche parenthèse, suivie par un ou plusieurs caractères, et terminé par un bouton droit de la parenthèse.
Si votre entrée est " (123) (456)', puis la première capture sera '123'. Non-greedy quantificateurs souhaitez autoriser le reste du motif de début correspondant dès que possible.
(Comme à votre confusion, je ne sais pas du tout à une expression rationnelle dialecte où ((.+?))
ferait la même chose. Je soupçonne que quelque chose s'est perdu dans la transmission de quelque part le long du chemin.)
Les ancres
Utiliser le modèle spécial ^
pour correspondre uniquement au début de votre entrée et $
pour correspondre qu'à la fin. Faire des "serre-livres" avec vos profils où l'on se dit, "je sais ce qui est à l'avant et à l'arrière, mais donnez-moi tout ce qui est entre" est une technique utile.
Dites que vous voulez faire correspondre les commentaires de la forme
-- This is a comment --
vous écrirez ^--\s+(.+)\s+--$
.
Construire votre propre
Les expressions régulières sont récursives, alors, maintenant que vous comprenez ces règles de base, vous pouvez les combiner comme vous le souhaitez.
Note de bas de page
†: La déclaration ci-dessus qu' .
correspond à tout caractère est une simplification à des fins pédagogiques qui n'est pas strictement vrai. Point correspond à tout caractère sauf le saut de ligne, "\n"
, mais dans la pratique, il est rare de s'attendre à un modèle tel que .+
de traverser un retour à la ligne de démarcation. Perl regexes ont un /s
de l'interrupteur et de Java, Pattern.DOTALL
, par exemple, .
correspond à aucun caractère à tous.