Reguliere expressies (met voorbeelden) - 1

"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
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:"

Les op Wikipedia