Expressions régulières (avec exemples) - 1

"Et maintenant, je vais vous parler des expressions régulières. Ce sujet est à la fois complexe et simple. Pour bien comprendre les expressions régulières, vous devrez peut-être lire deux ou trois livres volumineux, mais je peux vous apprendre à les utiliser. tout de suite."

"Comme les programmeurs expérimentés aiment plaisanter, si vous avez un problème et pensez que vous allez le résoudre avec des expressions régulières, vous avez maintenant deux problèmes."

"Hmm."

« J'espère que je ne t'ai pas trop effrayé, mon ami. Non ?

"D'accord, bien. Donc, notre nouveau sujet est les expressions régulières."

"Si nous les simplifions à l'excès, les expressions régulières sont des modèles pour les chaînes."

"Vous pouvez vérifier si une chaîne correspond à un modèle donné. Vous pouvez également diviser une chaîne en parties à l'aide d'un délimiteur ou d'un modèle."

"Mais commençons par quelque chose de simple : qu'est-ce qu'un motif ? "

"En SQL (mais pas en Java), vous pouvez vérifier si une chaîne correspond à un modèle particulier. Voici à quoi cela ressemble :"

name like 'Alex%'

Ici, name est une variable, comme une commande pour vérifier un modèle, et "Alex%" est le modèle.

Dans ce cas, % signifie n'importe quelle chaîne ou sous-chaîne.

Modèle Chaînes assorties au motif
'Alex%' Alex
Alex andr
Alex ander
Alex andra
….
'%X%' Ma x
Ma x im
Ale x andr
'%un' Olg a
Helen a
Ir a

"En SQL, si vous devez spécifier qu'il ne doit y avoir qu'un seul autre caractère, vous utiliserez le caractère de soulignement : "_"."

Modèle Chaînes assorties au motif
'Alex%_' Alex
Alex andr
Alex ander
Alex andra
….
'_X' Hache
Bx
Cx
'___' Aaa
Aab
Bbb

"Ça a du sens."

"D'accord, alors passons aux expressions régulières."

"Les expressions régulières incluent généralement des restrictions non seulement sur le nombre de caractères, mais aussi sur leur "contenu". "Tout masque se compose généralement de deux (parfois plus) parties : la première décrit les "préférences" des caractères et la seconde décrit le nombre de caractères. ."

"Voici quelques exemples de contenu :"

Modèle Description Exemples
. N'importe quel personnage 1
\d N'importe quel chiffre 7
\D Tout non-chiffre C
\s Un espace, un saut de ligne ou un caractère de tabulation ' '
\S Tout sauf les espaces, les tabulations et les sauts de ligne F
[az] N'importe quelle lettre de a à z z
[0-9] N'importe quel chiffre de 0 à 9. 8
\w N'importe quel caractère de mot c
\W Tout caractère autre qu'un mot _

"Je ne m'en souviendrai pas tout de suite, mais ça n'a pas l'air trop dur."

« Excellent, alors voici des exemples de nombre de caractères dans un masque : »

Modèle Description Exemples
UN? Le caractère 'A' apparaît une fois ou pas du tout UN
B+ Le caractère 'B' apparaît une ou plusieurs fois BBBB
C* Le caractère 'C' apparaît zéro ou plusieurs fois CCC
D{n} Le caractère 'D' apparaît n fois Le modèle D{4} correspond à DDDD
E{n,} Le caractère 'E' apparaît n fois ou plus Le motif E{2,} correspond à EEEEEEE
F{n,m} Le caractère 'F' apparaît entre n et m fois Le motif E{2,4} correspond à EEEE

"Tout cela semble assez simple."

"Vous comprenez tout si rapidement. Voyons maintenant à quoi ça ressemble tous ensemble :"

Modèle Description Exemples
[publicité]? Un caractère entre 'a' et 'd' apparaît une fois ou pas du tout a B c d
[bd,z]+ Les caractères 'b', 'c', 'd' ou 'z' apparaissent une ou plusieurs fois b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Les chiffres 1, 7, 8 ou 9 apparaissent zéro ou plusieurs fois 1, 7, 9, 9777, 111199
1{5} Le chiffre 1 apparaît 5 fois 11111
[1,2,a,b]{2} Les symboles 1, 2, 'a' ou 'b' apparaissent deux fois 11, 12, 1a, un ab, 2b, bb, 22
[a,0]{2,3} Les symboles 'a' ou 0 apparaissent 2 ou 3 fois aa, a0,00,0a, aaa,000, a00,0a0, a0a

"Toujours clair."

« Vraiment ? Hmm. Soit j'ai tout très bien expliqué, soit tu es trop rapide à assimiler. Eh bien, de toute façon, c'est bon pour nous.

"Voici quelques nouvelles idées pour vous."

"Étant donné que les expressions régulières sont souvent utilisées pour trouver des sous-chaînes, nous pouvons ajouter deux caractères supplémentaires (^ et $) à nos modèles."

"^ signifie que la sous-chaîne doit inclure le début de la chaîne."

"$ signifie que la sous-chaîne doit inclure la fin de la chaîne."

"Voici quelques exemples:"

Modèle Chaîne et sous-chaînes correspondant au modèle
un{3} aaa  aaa  aaa  _  _
un{3}$ aaa aaa  aaa
^a{3} aaa  aaa aaa
^a{3}$ aaa aaa aaa

"Et encore un point important."

"Dans les expressions régulières, les caractères suivants ont une signification particulière : [ ] \ / ^ $ . | ? * + ( ) { }. Ils sont appelés caractères de contrôle. Vous ne pouvez donc pas simplement les utiliser dans des chaînes."

"Comme dans le code Java, ils doivent être échappés. "Et encore une fois, comme dans le code Java, le caractère '\' est utilisé pour cela."

"Si nous voulons décrire une chaîne composée de trois '?' caractères, nous ne pouvons pas écrire '?{3}', car '?' est un caractère de contrôle. Nous devons le faire comme ceci : \?{3}. Si nous voulons utiliser un caractère '\', nous devons écrire '\\'."

"D'accord, j'ai compris."

"Et maintenant, voici une autre friandise intéressante. Dans les fichiers avec du code Java, le caractère '\' doit également être échappé dans les chaînes, car il s'agit d'un caractère de contrôle."

"Bien sûr."

"Donc, si vous essayez de définir une expression régulière Java dans une chaîne, vous devez échapper le caractère '\' deux fois."

"Voici un exemple :"

Je veux un masque qui correspond à 'c:\n'importe quoi'
En théorie, l'expression régulière devrait ressembler à ceci :
un caractère "c",
deux-points, une barre
oblique inverse,
un point et un astérisque (pour indiquer un nombre quelconque de caractères). J'ai ajouté des espaces pour améliorer la lisibilité :
c : \ .*
Mais les caractères '\' et '.' doivent être échappés, donc l'expression régulière ressemblera à ceci :
c :   \\ \. *
Ou, sans espaces
c : \\ \. *
"Nous devrions avoir trois barres obliques inverses dans notre expression régulière.
Cela signifie que dans un fichier Java, l'expression régulière ressemblera à ceci :"
String regexp = "c: \\\\ \\. *";

« Wow ! Whoa. Maintenant je sais.

"Et si vous décidez d'approfondir cela, voici quelques bons liens :"

Cours sur Wikipédia