
"En nu zal ik je vertellen over reguliere expressies. Dit onderwerp is tegelijkertijd zowel complex als eenvoudig. Om reguliere expressies grondig te begrijpen, moet je misschien twee of drie dikke boeken lezen, maar ik kan je leren hoe je ze moet gebruiken direct."
"Zoals ervaren programmeurs graag grappen: als je een probleem hebt en denkt het op te lossen met reguliere expressies, heb je nu twee problemen."
"Hm."
'Ik hoop dat ik je niet te veel heb laten schrikken, mijn vriend. Nee?'
"Oké, goed. Dus ons nieuwe onderwerp is reguliere expressies."
"Als we ze te simpel maken, zijn reguliere expressies patronen voor tekenreeksen."
"Je kunt controleren of een string overeenkomt met een bepaald patroon. Je kunt een string ook opsplitsen in delen met behulp van een scheidingsteken of een patroon."
"Maar laten we beginnen met iets simpels: wat is een patroon? "
"In SQL (maar niet in Java) kun je controleren of een string overeenkomt met een bepaald patroon. Zo ziet het eruit:"
name like 'Alex%'
Hier is naam een variabele, zoals een opdracht om een patroon te controleren, en "Alex%" is het patroon.
In dit geval betekent % elke tekenreeks of subtekenreeks.
Patroon | Strings die overeenkomen met het patroon |
---|---|
'Alex%' | Alex Alex andr Alex anders Alex andra …. |
'%X%' | Ma x Ma x im Ale x andr … |
'%A' | Olg een Helen een Ir een … |
"Als u in SQL moet specificeren dat er slechts één ander teken mag zijn, gebruikt u het onderstrepingsteken: "_".
Patroon | Strings die overeenkomen met het patroon |
---|---|
'Alex%_' | Alex andr Alex anders Alex andra …. |
'_X' | Bijl Bx Cx … |
'___' | Aaa Aab Bbb … |
"Dat is logisch."
"Oké, laten we dan verder gaan met reguliere expressies."
"Reguliere uitdrukkingen bevatten doorgaans niet alleen beperkingen op het aantal tekens, maar ook op hun 'inhoud'. "Elk masker bestaat meestal uit twee (soms meer) delen: het eerste beschrijft de 'voorkeuren' van het teken en het tweede beschrijft het aantal tekens ."
"Hier zijn enkele inhoudsvoorbeelden :"
Patroon | Beschrijving | Voorbeelden |
---|---|---|
. | Elk karakter | 1 |
\D | Elk cijfer | 7 |
\D | Elke niet-cijferige | C |
\S | Een spatie, regeleinde of tabteken | '' |
\S | Alles behalve spaties, tabs en regeleinden | F |
[az] | Elke letter van a tot z | z |
[0-9] | Elk cijfer van 0 tot 9. | 8 |
\w | Elk woordkarakter | C |
\W | Elk niet- woordkarakter | _ |
"Ik zal me die niet meteen herinneren, maar het ziet er niet al te moeilijk uit."
"Uitstekend, dan zijn hier voorbeelden van het aantal karakters in een masker: "
Patroon | Beschrijving | Voorbeelden |
---|---|---|
A? | Het karakter 'A' komt één keer of helemaal niet voor | A |
B+ | Het karakter 'B' komt één of meerdere keren voor | BBBB |
C* | Het karakter 'C' komt nul of meer keer voor | CCC |
D{n} | Het karakter 'D' komt n keer voor | Het patroon D{4} komt overeen met DDDD |
E{n,} | Het teken 'E' komt n of meer keer voor | Het patroon E{2,} komt overeen met EEEEEEE |
F{n,m} | Het teken 'F' komt tussen n en m keer voor | Het patroon E{2,4} komt overeen met EEEE |
"Dat lijkt allemaal vrij eenvoudig."
"Je hebt alles zo snel door. Laten we nu eens kijken hoe het er allemaal uitziet:"
Patroon | Beschrijving | Voorbeelden |
---|---|---|
[advertentie]? | Een teken tussen 'a' en 'd' komt één keer of helemaal niet voor | a, b, c, d |
[bd,z]+ | De tekens 'b', 'c', 'd' of 'z' komen één of meerdere keren voor | b, bcdcdbdbdbdbzzzzbbzbzb, zbz |
[1,7-9]* | De cijfers 1, 7, 8 of 9 komen nul of vaker voor | 1, 7, 9, 9777, 111199 |
1{5} | Het cijfer 1 komt 5 keer voor | 11111 |
[1,2,a,b]{2} | De symbolen 1, 2, 'a' of 'b' komen twee keer voor | 11, 12, 1a, ab, 2b, bb, 22 |
[a,0]{2,3} | De symbolen 'a' of 0 komen 2 of 3 keer voor | aa, a0,00,0a, aaa,000, a00,0a0, a0a |
"Nog steeds alles duidelijk."
'Echt waar? Hmm. Of ik heb alles heel goed uitgelegd, of je begrijpt het te snel. Nou, hoe dan ook, dat is goed voor ons.'
"Hier zijn een paar nieuwe inzichten voor u."
"Omdat reguliere expressies vaak worden gebruikt om substrings te vinden, kunnen we nog twee tekens (^ en $) aan onze patronen toevoegen."
"^ betekent dat de subtekenreeks het begin van de tekenreeks moet bevatten."
"$ betekent dat de subtekenreeks het einde van de tekenreeks moet bevatten."
"Hier zijn enkele voorbeelden:"
Patroon | String en substrings die overeenkomen met het patroon |
---|---|
een{3} | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa tijd _ _ _ |
een{3}$ | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa tijd |
^een{3} | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa tijd |
^een{3}$ | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa tijd |
"En nog een belangrijk punt."
"In reguliere expressies hebben de volgende tekens een speciale betekenis: [ ] \ / ^ $ . | ? * + ( ) { }. Ze worden controletekens genoemd. Je kunt ze dus niet zomaar in strings gebruiken."
"Net als in Java-code moeten ze worden geëscaped. "En net als in Java-code wordt hiervoor het '\'-teken gebruikt."
"Als we een string willen beschrijven die bestaat uit drie '?' karakters, kunnen we geen '?{3}' schrijven, omdat '?' is een controleteken. We moeten het zo doen: \?{3}. Als we een '\'-teken willen gebruiken, moeten we '\\' schrijven."
"OK ik snap het."
"En nu is er nog een interessant weetje. In bestanden met Java-code moet het '\'-teken ook in strings worden geëscaped, aangezien het een controleteken is."
"Natuurlijk."
"Dus als je probeert een Java-reguliere expressie in een string te definiëren, dan moet je het '\'-teken twee keer escapen."
"Hier is een voorbeeld:"
Ik wil een masker dat overeenkomt met 'c:\anything' |
In theorie zou de reguliere expressie er als volgt uit moeten zien: één 'c'-teken, dubbele punt, backslash, punt en sterretje (om een willekeurig aantal tekens aan te duiden). Ik heb spaties toegevoegd om de leesbaarheid te verbeteren: c : \ .* Maar de karakters '\' en '.' moeten worden ontsnapt, dus de reguliere expressie ziet er als volgt uit: c : \\ \. * Of, zonder spaties c: \\ \. * |
"We zouden drie backslashes in onze reguliere expressie moeten hebben. Dat betekent dat in een Java-bestand de reguliere expressie er als volgt uit zal zien:" String regexp = "c: \\\\ \\. *"; |
"Wow! Whoa. Nu weet ik het."
"En als je besluit hier dieper op in te gaan, zijn hier een paar goede links:"
GO TO FULL VERSION