Regulære udtryk (med eksempler) - 1

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

Lektion på Wikipedia