Niels Gamborgs online notesbog

Regulære udtryk. Regular expressions

juli 15th, 2008. Kategori: Programmering

Regulære udtryk er den danske oversættelse af regular expressions (forkortes ofte RegEx) .

Regulære udtryk er et meget kraftfuldt programmeringsredskab. Regulære udtryk bruges til at matche patterns, mønstre og søgeord i tekststrenge. Ofte kan samme resultater opnåes med de ordinære streng funktioner eller streng metoder, som de forskellige programmeringssprog stiller til rådighed. Men når de søgninger eller matchninger, man skal foretage bliver  komplekse, er det smart at bruge regulære udtryk.  Regular expressions kan spare os for mange liniers kode.

Regulære udtryk . Praktisk brug

Vi kan blandt andet bruge regulære udtryk til at sammenligne, redigere eller manipulere  specifikke mønstre eller tegnkarakterer i tekststrenge.
Regulære udtryk kan bruges til en mængde forskellige formål, når det gælder behandling eller analyse, blandt andet:

  • Validering af brugerinput i formular felter.
    • Består telefonnummer udelukkende af cifre?
    • Er der indtastet et @ i emailadressen?
    • Er der angivet et husnummer i adressen?
  • Erstatning af tegn i brugerinput.
    • F.eks. fjernelse af bindestreger og mellemrum i personnumre eller telefonnumre.
  • Manipulering at strenge fra andre kilder.
    • F.eks. genbrug at database data til andre formål, hvor man har behov for at fjerne visse karakterer.
    • RSS feeds, hvor man vil udelukke eller erstatte indhold i feeden.

Regulære udtryk. En oversigt 

Regulære udtryk  kan deles  op i 2 typer af tegn .

  • Almindelige tegn, der har deres pålydende værdi. Et “ø” er altså et ø, og et punktum er et punktum.
  • Metategn, der har en anden betydning end deres pålydende. Et punktum betyder f.eks.  ikke punktum, men er et jokettegn.

Almindelige tegn

De almindelige tegn udtrykker som sagt deres pålydende værdi. Noget af det mest interessante ved regulære udtryk er, at man kan samle karakterene i klasser.

Karakterklasser defineres i firkantparanteser. F.eks. vil [abc] vil matche et af bogstaverne  a,b eller c. Det samme vil [a-c].

Danske karaktere i regulære udtryk er ikke noget problem. Skal man matche dansk tegnsæt med f.eks: æ, ø og å, skriver du dem bare ind i karakterklasserne. [A-ZÆØÅa-zæøå_0-9]  matcher på den måde både store og små bogstaver i det danske alfabet, underscore og ciffrene 0-9.

Udover de klasser vi selv kan definere, findes også en række klasser af karakterer, der allerede er defineret. Det gælder f.eks. \d som er det samme som [0-9] eller \w som er det samme som [A-Za-z_0-9] . Backslashen foran henholdsvis d og w er et escape tegn, der betyder at vi ikke skal bruge d’s eller w’s pålydende værdi.

Metategn

Metategn har en anden værdi end den pålydende. F.eks. betyder  ”^” undtagen, så  [^æøåÆØÅ] er altså alle tegn undtagen æøå og ÆØÅ.

Metategn i regulære udtryk

. Matcher 1 vilkårlig karakter.
^ Matcher starten på en linie.
[^] Matcher alle karakter undtagen de nævnte.
$ Matcher slutningen af en linie.
? Matcher det foranstående element 0 eller 1 gang.
+ Matcher det foranstående element 1 eller flere gange.
* Matcher det foranstående element 0, 1 eller flere gange.
| Matcher enten udtrykker før eller efter stregen.

Hvis man vil matche et metategns pålydende værdi skal man escape det. F.eks. vil [\?] macthe et spørgsmålstegn.

De forskellige programmeringsprog benytter sig nogle gange af lidt forskellige metategn, men overordnet set er både syntaks og metategn meget lig hinanden.

Regulære udtryk i JavaScript

I JavaScript er indbygget flere funkioner, der benytter sig af regulære udtryk.

Her er et simpelt eksempel, der fjerner mellemrum og bindestreger fra en brugers input af et cpr-nummer.

streng = “01 01 74-1317”;
ny_streng = streng.replace(/[ -]/g, “”);

JavaScripts brug af regulære udtryk bygger på regular expressions i perl, og bruger derfor samme syntaks. Matchen er pakket ind mellem 2 slashes. Det lille g bag udtrykket angiver, at tegnene i karakterklassen skal skiftes ud alle steder, de optræder i strengen. 

Bemærk også at en bindestreg i en karakterklasse skal enten escapes med backslash, eller stå først eller sidst i klassen, for at have betydningen “bindestreg”. Ellers vil den have betydning “til” som i [0-9].

Regulære udtryk i PHP

I PHP er brugen af regulære udtryk indeholdt i standard bilbiotekerne og skal derfor heller ikke importeres på nogen måde.

Eksemplet viser, hvordan man kan strippe image-tags fra tekststrenge med regular expressions.

$streng = “Et billede <img src=’billede.jpg’ alt=’billede ‘/> siger mere end  tusinde ord”;
$ny_streng = ereg_replace(“<img[^>]*>”,””, $streng);

Først laves en ordinær match på substrengen “<img”. Dernæst er der en karakterklasse, der indeholder alle tegn  undtagen “>”. “*” angiver at indholdet af karakterklassen optræder et vilkårligt antal gange. Slut i matchen optræder slut-tagget “>”. Det hele erstattes af en tom streng.

Alternativt kan man istedet benytter preg_replace-funktionen. Preg står for “Perl regular expressions” og angiver at man i preg-replace() benytter perl syntaks for regulære udtryk. Det betyder i praksis, at matchen pakkes ind i to slashes. Udtrykket kommer derfor til at se sådan ud:

$ny_streng = preg_replace(“/<img[^>]*>/”,””, $streng);

Regulære udtryk i Java

For at bruge regulære udtryk  i Java, skal man først importere  java.util.regex, hvor regular expressions metoderne findes.

Brugen af regulære udtryk i Java adskiller sig fra de andre sprog ved at backslash selv er et metategn, og derfor også skal escapes,  når man skal escape andre metategn. Det vil sige, at hvis man f.eks. vil escape et spørgsmålstegn skal man bruge 2 backslashes foran spørgsmålstegnet.

Her er et simpelt eksempel, der viser hvordan man erstatter spørgsmålstegn, udråbstegn og semikolon med punktummer.

import java.util.regex.*;
String streng =  “Dette er en streng? Strengen er kort!”;
String ny_streng  =  streng.replaceAll(“[\\?!;]”,”.”);

replaceAll()  metoden erstatter alle forekomsterne af tegnene i strengen.

Regulære udtryk i Python

For et bruge regulære udtryk i Python skal man først importere regular expressions/regex modulet. 

Eksemplet fjerner paranteser, apostroffer og anføselstegn fra en streng ved at erstatte dem med en tom streng.

import re 
streng = “Her er en (kort) ’streng’.”
ny_streng = re.sub(“[\(\)\’\”,]”,””,streng) 

Bemærk alle backslashene i det regulære udtryk. De escaper karakterne, der alle er metategn.

Mere om regular expression

Her kan du finde mere om regular expressions . Både regular expressions generelt og deres brug i forskellige programmeringssprog.

På wikien kan du også finde en fremragende oversigt over regular expressions.

  1. 4 Responses to “Regulære udtryk. Regular expressions”

  2. By Martin Nielsen on jul 16, 2008

    Rigtig god gennemgang! Uden RegEx duer helten ikke, nu ved jeg hvor jeg skal referere folk til der vil ha en forklaring på RegEx!

    Lige omkring preg_replace – det behøver ikke være / / udtrykket omringes af, bruger oftest # # idet man så ikke behøver escape / i sine udtryk. Faktisk kan hvilken som helst boundry tegn bruges så længe de er ens, og ellers bliver escapet i udtrykket hvis de bliver brugt. En fordel med preg_replace frem for ereg_replace er helt klart at den kan tage to arrays som input, og derved kan man kører en hel stak RegEx i samme kald

  3. By Niels on jul 24, 2008

    Tak for det Martin. 🙂

    Vidste ikke at ikke det med PHP syntaksen, da de bruger slahes i php-maualen. Men det er meget nyttig viden. :tup:

    Er først selv begyndt at bruge regulære udtryk for alvorlig det sidste stykke tid. Regulære udtryk er virkelig et kraftfuldt værktøj, som man kan løse et hav af forskellige opgaver med.

    Og det fedeste er næsten er at syntaksen i de reguære udtryk, er stort set identisk på tværs af alle de gængse programmeringssprog.

  1. 2 Trackback(s)

  2. aug 2, 2008: Python tutorial. En intro til Python for begyndere. — Blog om webudvikling
  3. jul 5, 2012: Microsoft URL Rewrite Module 2.0 for IIS 7 | HTML-Faq.dk

Skriv en kommentar