Regulaere uttrykk (regex) er monstre som brukes til a soeke etter, matche og trekke ut tekst. Et sentralt verktoy i all tekstbehandling og sprakteknologi.
Oversikt
Regulaere uttrykk (regex) er et formelt sprak for a beskrive monstre i tekst. De brukes i nesten alle sprakteknologiske systemer -- fra tokenisering og informasjonsekstraksjon til datavalidering. I IN1140 er regex en av de mest praktiske ferdighetene du testes i, og oppgavene krever at du kan skrive presise uttrykk som matcher akkurat det som spesifiseres.
Grunnleggende byggeklosser
De viktigste operatorene i regex er: tegnklasser [abc] matcher ett av tegnene a, b eller c; [0-9] matcher et siffer; [a-zA-Z] matcher en bokstav. Disjunksjon a|b matcher enten a eller b -- merk at disjunksjon har lav presedens, sa ab|cd|efg matcher hele strengen "ab", "cd" eller "efg" (ikke bare enkeltbokstaver). Kvantitatorer: ? (0 eller 1), * (0 eller flere), + (1 eller flere), {n} (noyaktig n), {n,m} (mellom n og m). Grupperinger med parenteser () styrer presedens og fanger grupper.
Spesialtegn og escaping
Punktum . matcher et vilkarlig tegn. Backslash \ brukes for a escape spesialtegn, f.eks. \. for a matche et faktisk punktum. Forkortelser: \d = [0-9], \s = mellomrom/tab/newline, \w = ordtegn [a-zA-Z0-9_]. Ankere: ^ = starten av linjen, </code>=sluttenavlinjen.</p><h3>Parenteseroggrupperinger</h3><p>Parenteserhartofunksjoner:de<strong>grupperer</strong>uttrykkforastyrepresedens(f.eks.<code>(ab)+</code>matcher"ab","abab",osv.),ogde<strong>fanger</strong>delstrengerforbrukvidere.PaH2022−eksamenbleduspurtomparenteseriuttrykket<code>(0?[1−9]∣1[012])−(31∣[123]0∣[012]?[1−9])</code>kunnefjernes−−svaretavhengeravomparenteseneernodvendigeforaskillealternativeneinnenfordisjunksjonenfrarestenavuttrykket.</p><h3>Praktiskeeksamensoppgaver</h3><p>Regexertestetpa<em>alle</em>eksamener,ogoppgavenkommeralltidforst.Tohovedtypergarigjen:(1)<strong>Skrivetregexselv</strong>sommatcherenspesifikasjon−−f.eks.datoformat,pris,klokkeslettogbillettypeiettsoekeresultat,ellerenflerlinje−postadressemedfleregyldigevarianter.(2)<strong>Analyseretgittregex</strong>−−avgjorhvilkenstrengsom<em>ikke</em>matches,omenparenteskanfjernes,elleromenpastandomuttrykketersann/usann.Enklassisk"skrivselv"−varianteralageettuttrykksomgjenkjennerflereboyningsformeravenordliste(infinitiv,presens,preteritum,imperativ)vedhjelpavenfellesstammeogendisjunksjonavendelser,elleragjenkjenneenklasseforkortelserbygdopppaasammemate(bokstav(er)etterfulgtavpunktum,evt.gjentatt).Nokkeleneralltidabrytenedkraveneidelproblemerogbyggeuttrykketstegforsteg.</p><h3>Regulaereuttrykkogendeligetilstandsmaskiner</h3><p>Regulaereuttrykksvarerformelttil<strong>endeligetilstandsmaskiner</strong>(finite−stateautomata):etsetttilstandermedtransisjonerpainput−symboler,enstarttilstandogenellerflereaksepttilstander.Enmaskiner<strong>deterministisk</strong>(DFA)hvishverkombinasjonavtilstandogsymbolharnoyaktigentransisjon−−ellerserdenikke−deterministisk(NFA),f.eks.hvissammesymbolfraentilstandkanforetilfleretilstander,ellerhvisdetfinnestomme(epsilon−)transisjoner.Dukanblibedtomasetteoppen<strong>transisjonstabell</strong>(rader=tilstander,kolonner=symboler,celler=nestetilstand)ogbegrunneommaskinenerdeterministisk.</p><divclass="eksempel−boks"><h4>Eksempel1:Matchenorskedatoer(H2022−stil)</h4><p>Krav:Matchdatoersom5.6.2014,05.06.2014,5.6.14,05.06.14(dag.maned.ar).</p><pre><code>/([012]?[1−9]∣[123]0∣31)(˙0?[1−9]∣1[012])\d˙\d(\d\d)?/</code></pre><p>Forklaring:Dagenmatcher1−31(medvalgfriledendenull),etterfulgtavpunktum,maned1−12,punktum,ogtoellerfiresifreforaret.</p></div><divclass="eksempel−boks"><h4>Eksempel2:Matchetelefonnumre(H2021−stil)</h4><p>Gitt:<code>(( +47∣0047)\s)?([0−9][0−9]\s)3([0−9][0−9])1</code></p><p>Sporsmaletvaromuttrykket<em>kun</em>gjenkjennernumresom<em>begynnermed</em>+47/0047,elleromdetogsaamatchernumre<em>uten</em>landskode.Svaret:Gruppenmedlandskodeervalgfri(markertmed<code>?</code>),sauttrykketmatcherbademedogutenlandskode.Paastand1("kunmedlandskode")eraltsaausann.</p></div><divclass="eksempel−boks"><h4>Eksempel3:Ettregexforflereboyningsformer(skriv−selv−stil)</h4><p>Oppgave:Skrivettregulaertuttrykksomgjenkjennerinfinitiv,presens,preteritumogimperativavverbene<em>danse</em>,<em>hoppe</em>og<em>rope</em>.</p><p>Strategi:Samlestammeneiendisjunksjon,ogleggendelseneutenpaa.Imperativ=stammenalene,infinitiv=stamme+e,presens=stamme+er,preteritum=stamme+et/te.Etmuliguttrykk:</p><pre><code>/(dans∣hopp∣rop)(e∣er∣et)?/</code></pre><p>Hererstammen<code>(dans∣hopp∣rop)</code>felles,og<code>(e∣er∣et)?</code>dekkerdeboydeformenemensdenvalgfrie<code>?</code>tillaterimperativen(barstamme).Legggjernetilankere<code>... hvis uttrykket skal matche hele ordet og ikke bare en delstreng. Poenget sensor ser etter er at du faktorerer ut det felles og bruker disjunksjon + valgfrie grupper -- ikke at du lister hver form for seg.