"Og nu vil jeg fortælle dig om regulære udtryk. Dette emne er både komplekst og enkelt på samme tid. For at forstå regulære udtryk til bunds, skal du måske læse to eller tre heftige bøger, men jeg kan lære dig at bruge dem lige nu."
"Som erfarne programmører kan lide at joke, hvis du har et problem og tror, du vil løse det med regulære udtryk, har du nu to problemer."
"Hmm."
"Jeg håber ikke, jeg skræmte dig for meget, min ven. Nej?"
"Okay, godt. Så vores nye emne er regulære udtryk."
"Hvis vi oversimplifiserer dem, er regulære udtryk mønstre for strenge."
"Du kan kontrollere, om en streng matcher et givet mønster. Du kan også opdele en streng i dele ved hjælp af en afgrænsning eller et mønster."
"Men lad os starte med noget simpelt: hvad er et mønster? "
"I SQL (men ikke i Java) kan du kontrollere, om en streng matcher et bestemt mønster. Sådan ser det ud:"
name like 'Alex%'
Her er navn en variabel, som er en kommando til at kontrollere et mønster, og "Alex%" er mønsteret.
I dette tilfælde betyder % enhver streng eller understreng.
Mønster | Strenge der matcher mønsteret |
---|---|
'Alex%' | Alex Alex andr Alexander Alex andre … . |
'%x%' | Ma x Ma x im Ale x andr … |
'%en' | Olg a Helen og Ir a … |
"I SQL, hvis du skal angive, at der kun skal være ét andet tegn, så vil du bruge understregningstegnet: "_"."
Mønster | Strenge der matcher mønsteret |
---|---|
'Alex%_' | Alex andr Alexander Alex andre … . |
'_x' | Økse Bx Cx … |
'___' | Aaa Aab Bbb … |
"Det giver mening."
"Okay, så lad os gå videre til regulære udtryk."
"Regulære udtryk inkluderer typisk begrænsninger ikke kun på antallet af tegn, men også deres 'indhold'. "Enhver maske består normalt af to (nogle gange flere) dele: den første beskriver karakter 'præferencer', og den anden beskriver antallet af tegn ."
"Her er nogle indholdseksempler :"
Mønster | Beskrivelse | Eksempler |
---|---|---|
. | Enhver karakter | 1 |
\d | Ethvert ciffer | 7 |
\D | Ethvert ikke-cifret | C |
\s | Et mellemrum, linjeskift eller tabulatortegn | ' ' |
\S | Alt undtagen mellemrum, tabulatorer og linjeskift | f |
[az] | Ethvert bogstav fra a til z | z |
[0-9] | Ethvert ciffer fra 0 til 9. | 8 |
\w | Ethvert ordkarakter | c |
\W | Ethvert ikke-ord- tegn | _ |
"Jeg husker dem ikke lige med det samme, men det ser ikke for svært ud."
"Fremragende, så er her eksempler på antallet af tegn i en maske: "
Mønster | Beskrivelse | Eksempler |
---|---|---|
EN? | Tegnet 'A' forekommer én gang eller slet ikke | EN |
B+ | Tegnet 'B' forekommer en eller flere gange | BBBB |
C* | Tegnet 'C' forekommer nul eller flere gange | CCC |
D{n} | Tegnet 'D' forekommer n gange | Mønsteret D{4} matcher DDDD |
E{n,} | Tegnet 'E' forekommer n eller flere gange | Mønsteret E{2,} matcher EEEEEEE |
F{n,m} | Tegnet 'F' forekommer mellem n og m gange | Mønsteret E{2,4} matcher EEEE |
"Det hele virker ret ligetil."
"Du fanger alting så hurtigt. Lad os nu se, hvordan det hele ser ud:"
Mønster | Beskrivelse | Eksempler |
---|---|---|
[annonce]? | Et tegn mellem 'a' og 'd' forekommer én gang eller slet ikke | a, b, c, d |
[bd,z]+ | Tegnene 'b', 'c', 'd' eller 'z' forekommer en eller flere gange | b, bcdcdbdbdbdbzzzzbbzbzb, zbz |
[1,7-9]* | Cifrene 1, 7, 8 eller 9 forekommer nul eller flere gange | 1, 7, 9, 9777, 111199 |
1{5} | Cifferet 1 forekommer 5 gange | 11111 |
[1,2,a,b]{2} | Symbolerne 1, 2, 'a' eller 'b' forekommer to gange | 11, 12, 1a, ab, 2b, bb, 22 |
[a,0]{2,3} | Symbolerne 'a' eller 0 forekommer 2 eller 3 gange | aa, a0,00,0a, aaa,000, a00,0a0, a0a |
"Stadig alt klart."
"Virkelig? Hmm. Enten har jeg forklaret alt rigtig godt, eller også er du for hurtig på optagelsen. Nå, uanset hvad, så er det godt for os."
"Her er et par nye indsigter til dig."
"Da regulære udtryk ofte bruges til at finde understrenge, kan vi tilføje yderligere to tegn (^ og $) til vores mønstre."
"^ betyder, at understrengen skal indeholde begyndelsen af strengen."
"$ betyder, at understrengen skal indeholde slutningen af strengen."
"Her er nogle eksempler:"
Mønster | Streng og understrenge, der matcher mønsteret |
---|---|
en{3} | aaa a aaa a aaa |
en{3}$ | aaa a aaa a aaa |
^a{3} | aaa a aaa a aaa |
^a{3}$ | aaa a aaa a aaa |
"Og endnu et vigtigt punkt."
"I regulære udtryk har følgende tegn en speciel betydning: [ ] \ / ^ $ . | ? * + ( ) { }. De kaldes kontroltegn. Så du kan ikke bare bruge dem i strenge."
"Som i Java-kode, skal de escapes. "Og igen som i Java-kode, bruges '\'-tegnet til dette."
"Hvis vi vil beskrive en streng bestående af tre '?" tegn, kan vi ikke skrive '?{3}', fordi '?' er et kontroltegn. Vi skal gøre det sådan: \?{3}. Hvis vi vil bruge et '\'-tegn, skal vi skrive '\\'."
"Ok, forstået."
"Og nu er her en anden interessant godbid. I filer med Java-kode skal '\'-tegnet også escapes i strenge, da det er et kontroltegn."
"Selvfølgelig."
"Så hvis du forsøger at definere et regulært Java-udtryk i en streng, så skal du undslippe '\'-tegnet to gange."
"Her er et eksempel:"
Jeg vil have en maske, der matcher 'c:\anything' |
I teorien skulle det regulære udtryk se sådan ud: ét 'c'-tegn, kolon, omvendt skråstreg, punktum og stjerne (for at angive et vilkårligt antal tegn). Jeg tilføjede mellemrum for at forbedre læsbarheden: c : \ .* Men tegnene '\' og '.' skal escapes, så det regulære udtryk ser således ud: c : \\ \. * Eller uden mellemrum c: \\ \. * |
"Vi bør have tre omvendte skråstreg i vores regulære udtryk. Det betyder, at i en Java-fil vil det regulære udtryk se sådan ud:" String regexp = "c: \\\\ \\. *"; |
"Wow! Hov. Nu ved jeg det."
"Og hvis du beslutter dig for at grave dybere ned i dette, er her et par gode links:"
GO TO FULL VERSION