Reguljära uttryck (med exempel) - 1

"Och nu ska jag berätta om reguljära uttryck. Det här ämnet är både komplext och enkelt på samma gång. För att riktigt förstå reguljära uttryck kan du behöva läsa två eller tre rejäla böcker, men jag kan lära dig hur du använder dem just nu."

"Som erfarna programmerare gillar att skämta, om du har ett problem och tror att du ska lösa det med reguljära uttryck, nu har du två problem."

"Hmm."

"Jag hoppas att jag inte skrämde dig för mycket, min vän. Nej?"

"Okej, bra. Så, vårt nya ämne är reguljära uttryck."

"Om vi ​​förenklar dem är reguljära uttryck mönster för strängar."

"Du kan kontrollera om en sträng matchar ett givet mönster. Du kan också dela upp en sträng i delar med hjälp av en avgränsare eller ett mönster."

"Men låt oss börja med något enkelt: vad är ett mönster? "

"I SQL (men inte i Java) kan du kontrollera om en sträng matchar ett visst mönster. Så här ser det ut:"

name like 'Alex%'

Här är namn en variabel, som är ett kommando för att kontrollera ett mönster, och "Alex%" är mönstret.

I det här fallet betyder % vilken sträng eller delsträng som helst.

Mönster Snören som matchar mönstret
"Alex%" Alex
Alex andr
Alexander
Alex andra
… .
'%x%' Ma x
Ma x im
Ale x andr
'%a' Olg a
Helen och
Ir a
...

"I SQL, om du behöver ange att det bara ska finnas ett annat tecken, så använder du understreckstecknet: "_"."

Mönster Snören som matchar mönstret
'Alex%_' Alex
Alex andr
Alexander
Alex andra
… .
'_x' Axe
Bx
Cx
'___' Aaa
Aab
Bbb

"Det känns logiskt."

"Okej, låt oss gå vidare till reguljära uttryck."

"Reguljära uttryck inkluderar vanligtvis begränsningar inte bara för antalet tecken, utan också deras "innehåll". "Varje mask som helst består vanligtvis av två (ibland fler) delar: den första beskriver tecknets "preferenser" och den andra beskriver antalet tecken ."

"Här är några innehållsexempel :"

Mönster Beskrivning Exempel
. Vilken karaktär som helst 1
\d Vilken siffra som helst 7
\D Alla icke-siffriga C
\s Ett mellanslag, radbrytning eller tabbtecken ' '
\S Allt utom mellanslag, tabbar och radbrytningar f
[az] Vilken bokstav som helst från a till z z
[0-9] Vilken siffra som helst från 0 till 9. 8
\w Vilket ord som helst c
\W Alla tecken som inte är ord _

"Jag kommer inte ihåg dem direkt, men det ser inte så svårt ut."

"Utmärkt, här är exempel på antalet tecken i en mask: "

Mönster Beskrivning Exempel
A? Tecknet "A" förekommer en gång eller inte alls A
B+ Tecknet 'B' förekommer en eller flera gånger BBBB
C* Tecknet 'C' förekommer noll eller fler gånger CCC
D{n} Tecknet 'D' förekommer n gånger Mönstret D{4} matchar DDDD
E{n,} Tecknet 'E' förekommer n eller flera gånger Mönstret E{2,} matchar EEEEEEE
F{n,m} Tecknet 'F' förekommer mellan n och m gånger Mönstret E{2,4} matchar EEEE

"Det hela verkar ganska okomplicerat."

"Du kommer på allt så snabbt. Låt oss nu se hur det ser ut tillsammans:"

Mönster Beskrivning Exempel
[annons]? Ett tecken mellan 'a' och 'd' förekommer en gång eller inte alls a, b, c, d
[bd,z]+ Tecknen 'b', 'c', 'd' eller 'z' förekommer en eller flera gånger b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Siffrorna 1, 7, 8 eller 9 förekommer noll eller fler gånger 1, 7, 9, 9777, 111199
1{5} Siffran 1 förekommer 5 gånger 11111
[1,2,a,b]{2} Symbolerna 1, 2, 'a' eller 'b' förekommer två gånger 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Symbolerna 'a' eller 0 förekommer 2 eller 3 gånger aa, a0,00,0a, aaa,000, a00,0a0, a0a

"Fortfarande allt klart."

"Verkligen? Hmm. Antingen förklarade jag allt riktigt bra eller så är du för snabb på upptagningen. Nåväl, hur som helst, det är bra för oss."

"Här är ett par nya insikter för dig."

"Eftersom reguljära uttryck ofta används för att hitta delsträngar kan vi lägga till ytterligare två tecken (^ och $) till våra mönster."

"^ betyder att delsträngen måste inkludera början av strängen."

"$ betyder att delsträngen måste inkludera slutet av strängen."

"Här är några exempel:"

Mönster Sträng och delsträngar som matchar mönstret
en{3} aaa  a  aaa  aaa  _
en{3}$ aaa a aaa  aaa
^a{3} aaa  a aaa aaa
^a{3}$ aaa a aaa a aaa

"Och ytterligare en viktig punkt."

"I reguljära uttryck har följande tecken speciell betydelse: [ ] \ / ^ $ . | ? * + ( ) { }. De kallas kontrolltecken. Så du kan inte bara använda dem i strängar."

"Som i Java-kod måste de escapes. "Och igen som i Java-kod, används tecknet '\' för detta."

"Om vi ​​vill beskriva en sträng som består av tre '?" tecken kan vi inte skriva '?{3}', eftersom '?' är ett kontrolltecken. Vi måste göra det så här: \?{3}. Om vi ​​vill använda ett '\'-tecken, måste vi skriva '\\'."

"Ok, förstår."

"Och nu kommer här en annan intressant godbit. I filer med Java-kod måste '\'-tecknet också escapes i strängar, eftersom det är ett kontrolltecken."

"Självklart."

"Så, om du försöker definiera ett reguljärt Java-uttryck i en sträng, måste du undkomma tecknet '\' två gånger."

"Här är ett exempel:"

Jag vill ha en mask som matchar "c:\anything"
I teorin bör det reguljära uttrycket se ut så här:
ett "c"-tecken,
kolon,
omvänt snedstreck,
punkt och asterisk (för att beteckna valfritt antal tecken). Jag lade till mellanslag för att förbättra läsbarheten:
c : \ .*
Men tecknen '\' och '.' måste escapes, så det reguljära uttrycket kommer att se ut så här:
c :   \\ \. *
Eller, utan mellanslag
c: \\ \. *
"Vi bör ha tre omvända snedstreck i vårt reguljära uttryck.
Det betyder att i en Java-fil kommer det reguljära uttrycket att se ut så här:"
String regexp = "c: \\\\ \\ . *";

"Wow! Whoa. Nu vet jag."

"Och om du bestämmer dig för att gräva djupare i detta, här är ett par bra länkar:"

Lektion på Wikipedia