Regelmessige uttrykk (med eksempler) - 1

"Og nå skal jeg fortelle deg om regulære uttrykk. Dette emnet er både komplekst og enkelt på samme tid. For å forstå regulære uttrykk grundig, må du kanskje lese to eller tre heftige bøker, men jeg kan lære deg hvordan du bruker dem akkurat nå."

"Som erfarne programmerere liker å spøke, hvis du har et problem og tror du skal løse det med regulære uttrykk, har du nå to problemer."

"Hmm."

"Jeg håper jeg ikke skremte deg for mye, min venn. Nei?"

"Ok, bra. Så, vårt nye emne er vanlige uttrykk."

"Hvis vi forenkler dem, er regulære uttrykk mønstre for strenger."

"Du kan sjekke om en streng samsvarer med et gitt mønster. Du kan også dele en streng i deler ved å bruke et skilletegn eller et mønster."

"Men la oss starte med noe enkelt: hva er et mønster? "

"I SQL (men ikke i Java) kan du sjekke om en streng samsvarer med et bestemt mønster. Slik ser det ut:"

name like 'Alex%'

Her er navnet en variabel, som er en kommando for å sjekke et mønster, og "Alex%" er mønsteret.

I dette tilfellet betyr % en hvilken som helst streng eller delstreng.

Mønster Strenger som 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 trenger å spesifisere at det bare skal være ett annet tegn, vil du bruke understrekingstegnet: "_"."

Mønster Strenger som matcher mønsteret
'Alex%_' Alex
Alex andr
Alexander
Alex andre
… .
'_x' Øks
Bx
Cx
'___' Aaa
Aab
Bbb

"Det gir mening."

"Ok, la oss gå videre til regulære uttrykk."

"Regulære uttrykk inkluderer vanligvis begrensninger ikke bare på antall tegn, men også deres 'innhold'. "Enhver maske består vanligvis av to (noen ganger flere) deler: den første beskriver tegnet 'preferanser', og den andre beskriver antall tegn ."

"Her er noen innholdseksempler :"

Mønster Beskrivelse Eksempler
. Enhver karakter 1
\d Hvilket som helst siffer 7
\D Alle ikke-siffer C
\s Et mellomrom, linjeskift eller tabulatortegn ' '
\S Alt unntatt mellomrom, tabulatorer og linjeskift f
[az] Enhver bokstav fra a til å z
[0-9] Ethvert siffer fra 0 til 9. 8
\w Et hvilket som helst ordkarakter c
\W Ethvert ikke-ord- tegn _

"Jeg vil ikke huske dem med en gang, men det ser ikke så vanskelig ut."

"Utmerket, så her er eksempler på antall tegn i en maske: "

Mønster Beskrivelse Eksempler
EN? Tegnet 'A' forekommer én gang eller ikke i det hele tatt EN
B+ Tegnet 'B' forekommer en eller flere ganger BBBB
C* Tegnet 'C' forekommer null eller flere ganger CCC
D{n} Tegnet 'D' forekommer n ganger Mønsteret D{4} samsvarer med DDDD
E{n,} Tegnet 'E' forekommer n eller flere ganger Mønsteret E{2,} samsvarer med EEEEEEE
F{n,m} Tegnet 'F' forekommer mellom n og m ganger Mønsteret E{2,4} samsvarer med EEEE

"Det hele virker ganske enkelt."

"Du fanger alt så raskt. La oss nå se hvordan det ser ut sammen:"

Mønster Beskrivelse Eksempler
[annonse]? Et tegn mellom 'a' og 'd' forekommer én gang eller ikke i det hele tatt a, b, c, d
[bd,z]+ Tegnene 'b', 'c', 'd' eller 'z' forekommer en eller flere ganger b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Sifrene 1, 7, 8 eller 9 forekommer null eller flere ganger 1, 7, 9, 9777, 111199
1{5} Sifferet 1 forekommer 5 ganger 11111
[1,2,a,b]{2} Symbolene 1, 2, 'a' eller 'b' forekommer to ganger 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Symbolene 'a' eller 0 forekommer 2 eller 3 ganger aa, a0,00,0a, aaa,000, a00,0a0, a0a

"Fortsatt helt klart."

"Virkelig? Hmm. Enten forklarte jeg alt veldig bra, eller så er du for rask på opptaket. Vel, uansett, det er bra for oss."

"Her er et par nye innsikter for deg."

"Siden regulære uttrykk ofte brukes for å finne understrenger, kan vi legge til ytterligere to tegn (^ og $) til mønstrene våre."

"^ betyr at delstrengen må inkludere begynnelsen av strengen."

"$ betyr at understrengen må inkludere slutten av strengen."

"Her er noen eksempler:"

Mønster Streng og delstrenger som samsvarer med mønsteret
en{3} aaa  a  aaa  aaa  _
en{3}$ aaa a aaa  aaa
^a{3} aaa  a aaa aaa
^a{3}$ aaa a aaa aaa

"Og enda et viktig poeng."

"I regulære uttrykk har følgende tegn spesiell betydning: [ ] \ / ^ $ . | ? * + ( ) { }. De kalles kontrolltegn. Så du kan ikke bare bruke dem i strenger."

"Som i Java-kode, må de escapes. "Og igjen som i Java-kode, brukes '\'-tegnet for dette."

"Hvis vi vil beskrive en streng som består av tre '?" tegn, kan vi ikke skrive '?{3}', fordi '?' er et kontrolltegn. Vi må gjøre det slik: \?{3}. Hvis vi vil bruke et '\'-tegn, må vi skrive '\\'."

"Ok, skjønner."

"Og nå er her en annen interessant godbit. I filer med Java-kode må '\'-tegnet også være escaped i strenger, siden det er et kontrolltegn."

"Selvfølgelig."

"Så, hvis du prøver å definere et regulært Java-uttrykk i en streng, må du unnslippe '\'-tegnet to ganger."

"Her er et eksempel:"

Jeg vil ha en maske som matcher 'c:\anything'
I teorien skal det regulære uttrykket se slik ut:
ett 'c'-tegn,
kolon,
omvendt skråstrek,
punktum og stjerne (for å angi et hvilket som helst antall tegn). Jeg la til mellomrom for å forbedre lesbarheten:
c : \ .*
Men tegnene '\' og '.' må escapes, så det regulære uttrykket vil se slik ut:
c :   \\ \. *
Eller uten mellomrom
c: \\ \. *
"Vi bør ha tre omvendte skråstreker i vårt regulære uttrykk.
Det betyr at i en Java-fil vil det regulære uttrykket se slik ut:"
String regexp = "c: \\\\ \\. *";

"Wow! Whoa. Nå vet jeg det."

"Og hvis du bestemmer deg for å grave dypere inn i dette, her er et par gode linker:"

Leksjon på Wikipedia