Kapitel 2. Hvad er et regulært udtryk

Et regulært udtryk er en måde at angive betingelser der skal være opfyldt for en situation man tænker på. Normalt når du søger i en teksteditor angiver du teksten der skal søges efter bogstaveligt. Ved brug af regulære udtryk, på den anden side, fortæller du hvordan en given match skal se ud. Eksempler på dette inkluderer Jeg leder efter ordet KDE, men kun i begyndelsen af linjen, eller Jeg leder efter ordet den, men det skal stå for sig selv, eller Jeg leder efter filer der begynder med ordet test, fulgt af et antal cifre, for eksempel test12, test107 og test007

Du bygger regulære udtryk fra mindre regulære udtryk, ligesom du bygger store Lego-legetøjsting fra mindre dele. Ligesom i Lego-verdenen, er der et antal basale byggeblokke. I det følgende vil jeg beskrive hver af disse basale byggeblokke ved brug af et antal eksempler.

Eksempel 2.1. Søgning efter normal tekst.

Hvis du kun ønsker at søge efter en given tekst, er et regulært udtryk bestemt ikke et godt valg. Grunden er at regulære udtryk tilknytter en speciel betydning til visse tegn. Dette inkluderer følgende tegn: .*|$. Hvis du altså ønsker at søge efter teksten kde. (dvs tegnene kde fulgt af et punktum), så vil du skulle angive dette som kde\.[1] At skrive \. snarere end blot . kaldes at escape.

Eksempel 2.2. Matchende URL'er

Når du vælger noget der ser ud som en URL i KDE, så vil programmet klipper tilbyde at starte konqueror med en valgte URL.

Klipper gør dette ved at matche markeringen mod adskillige forskellige regulære udtryk, når et af de regulære udtryk matcher, bil hjælpekommandoen blive tilbudt.

Det regulære udtryk for URL'er siger (blandt andet), at markeringen skal begynde med teksten http://. Dette beskrives ved brug af regulære udtryk med at sætte en hat (^-tegnet). foran http://).

Ovestående er et eksempel på matchende positioner ved brug af regulære udtryk. Tilsvarende kan positionen linjeslut matches ved brug af tegnet $ (dvs. et dollar-tegn).

Eksempel 2.3. Søgning efter ordet den, men ikke denne, hånden eller mandens

To ekstra positionstyper kan matches på ovenstående måde, nemlig positionen ved en ordgrænse, og positionen ved en ikke-ordgrænse. Disse positioner angives ved hjælp af teksten \b (for ordgrænse) og \B (for ikke-ordgrænse)

Derfor består søgning efter ordet den i at bruge det regulære udtryk \bden\b. Dette angiver at vi søger efter den uden bogstaver på nogen af siderne (dvs. med en ordgrænse på hver side)

De fire positioner der matcher et regulært udtryk indsættes i editoren for regulære udtryk ved brug af fire forskellige positioner værktøjet

Eksempel 2.4. Søgning efter enten den eller det

Forestil dig at du ønsker at gennemgå dit dokument søgende efter enten ordet den eller ordet det. Med en sædvanlig søgemetode kunne du gøre dette i to omgange, i første omgang ville du søge efter den, og i anden omgang ville du søge efter det.

Ved brug af regulært udtryk søgning vil du kunne søge efter begge i én omgang. Du gør dette ved at søge efter det|den. det vil sige ved at adskille de to ord med en lodret linje.[2]

I editoren for regulære udtryk skriver du ikke selv den lodrette linje, men du vælger i stedet alternativt værktøj, og indsætter de mindre regulære udtryk ovenover hinanden.

Eksempel 2.5. Matche nogetsomhelst

Regulære udtryk sammenlignes ofte med jokertegn-matchning i skallen - det vil sige muligheden for at angive et antal filer ved brug af stjernen. Du genkender formodentlig jokertegn-matchning fra følgende eksempler:

  • ls *.txt - her er *.txt skallens jokertegn som matcher alle filer som slutter med filendelsen .txt.

  • cat test??.res - matcher hver fil der begynder med test fulgt af to vilkårlige tegn, og endelig efterfulgt af .res

I skallen matcher stjernen et vilkårligt tegn et vilkårligt antal gange. Stjerne matcher med andre ord hvadsomhelst. Dette skrives som .* i syntaksen for regulære udtryk. Prikken matcher et vilkårligt enkelt tegn, dvs blot ét tegn, og stjernen siger at det regulære udtryk før dette skal matches et vilkårligt antal gange. Tilsammen siger dette et enkelt tegn et vilkårligt antal gange.

Dette synes måske vældig kompliceret, men når du ser det større billede vil du også kunne se styrken. Lad mig vise dig et andet basalt regulært udtryk: a. Bogstavet a for sig selv er et regulært udtryk der matcher et enkelt bogstav, nemlig bogstavet a. Hvis vi kombinerer det med stjernen, altså a*, så har vi et regulært udtryk der matcher et vilkårligt antal a'er.

Vi kan kombinere flere regulære udtryk efter hinanden, for eksempel siger lod(de)*. [3] Forestil dig at du havde skrevet dette regulære udtryk i søgefeltet i en teksteditor, så ville du have fundet følgende ord (blandt andre): lod, lodde, loddede, loddededededede

Når du har forstået dette er det forhåbentlig ikke svært for dig at skrive skal-joker-søgningen test??.res som et regulært udtryk. Svar: test..\.res. Prikken for sig selv er et vilkårligt tegn. For at matche en enkel prik må du skrive \.[4]. Det regulære udtryk \. matcher med andre ord et punktum, mens et punktum for sig selv matcher et vilkårligt tegn.

I editoren for regulære udtryk, laves gentagne regulære udtryk ved brug af gentagelsesværktøjet

Eksempel 2.6. Erstatning af & med & i et HTML-dokument

I HTML skal det specielle tegn & skrives som & - dette er ligesom at escape i et regulært udtryk.

Forestil dig at du har skrevet et HTML-dokument i en normal editor (f.eks. XEmacs eller Kate), og du havde fuldstændig glemt denne regel. Når du bliver klar over denne fejl bliver du så nødt til at erstatte hver forekomst af & med &.

Dette kan man sagtens gøre med normal 'søg og erstat', der er imidlertid et lille problem. Lad os sige at du huskede denne regel - en gang imellem - og gjorde det rigtigt nogle steder. Ubetinget erstatning vil nu resultere i at & bliver erstattet med &

Det du virkelig ønsker at gøre er at & kun skal erstattes hvis der ikke efterfølges af bogstaverne amp;. Du kan gøre dette ved brug af regulære udtryk ved noget der hedder positiv fremadskuen.

Det regulære udtryk, der kun matcher et ét-tegn hvis det ikke efterfølges af bogstaverne amp; ser sådan her ud: &(?!amp;). Det her er selvfølgelig nemmere at læse ved brug af editoren for regulære udtryk, hvor du ville bruge fremadskuen-værktøjerne.



[1] Editoren for regulære udtryk løser dette problem ved at tage sig escape-reglerne for dig.

[2] Bemærk at på hver side af den lodrette linje er der et regulært udtryk, så denne egenskab bruges ikke blot til at søge efter to forskellige stumper tekst,men til at søge efter to forskellige regulære udtryk.

[3] (de)* siger at det, der er indenfor parenteserne, gentages et vilkårligt antal gange.

[4] Dette kaldes at escape