Gå til indholdet

Regular Expresions

Regulære udtryk, også kendt som regex, er en kraftfuld metode til mønstermatchning og tekstbehandling. Det giver mulighed for at søge, analysere og manipulere tekst efter specifikke mønstre. Regex blev oprindeligt udviklet af matematikeren Stephen Cole Kleene i 1950’erne og senere populariseret i 1960’erne af dataloger som Ken Thompson og Peter J. Landin.

Historisk set blev regulære udtryk først brugt inden for teoretisk datalogi til at beskrive regulære sprog. Disse sprog kan repræsenteres ved hjælp af endelige automater, der er en slags matematisk model for beregning. Regulære udtryk giver mulighed for at beskrive mønstrene i disse sprog på en kompakt og abstrakt måde.

I løbet af årene blev regex-implementeringer og syntaksen udviklet til forskellige programmeringssprog og tekstredigeringsværktøjer. Selvom detaljerne kan variere lidt fra sprog til sprog, er de grundlæggende principper og koncepter i regex stadig de samme.

Syntaksen i regulære udtryk er baseret på en kombination af almindelige tegn og specialtegn. Almindelige tegn repræsenterer sig selv og matcher nøjagtigt det samme tegn i teksten. For eksempel matcher regulært udtryk “abc” teksten “abc” præcist. Specialtegn, også kaldet metategn, giver mulighed for at beskrive mere komplekse mønstre. Eksempler på specialtegn inkluderer metategnet “.” (punktum), der matcher ethvert tegn undtagen en linjeskift, og metategnet “*” (stjerne), der matcher nul eller flere forekomster af det foregående tegn eller gruppe.

Regulære udtryk bruges i mange områder af softwareudvikling og tekstbehandling. De kan anvendes til validering af input, søgning og udtrækning af data, udskiftning af tekststykker og meget mere. At have en grundlæggende forståelse af regex og dets syntaks giver programmører og tekstredigeringsbrugere et kraftfuldt værktøj til at manipulere og analysere tekst efter deres behov.

Info

Se også aloisdg/awesome-regex

Syntaks

Syntaksen i regulære udtryk giver dig mulighed for at beskrive komplekse mønstre i en tekststreng. Her er nogle af de mest almindelige syntaktiske elementer, der bruges i regulære udtryk:

  1. Almindelige tegn: Almindelige tegn matcher sig selv i teksten. For eksempel matcher bogstavet “a” teksten “a”.

  2. Metategn: Metategn er specielle tegn, der bruges til at beskrive mere komplekse mønstre.

  3. ”.” (punktum): Matcher ethvert tegn undtagen en linjeskift.
  4. ”^” (caret): Matcher starten af en linje.
  5. ”$” (dollartegn): Matcher slutningen af en linje.
  6. ”|” (lodret streg): Matcher et af flere mulige udtryk. For eksempel matcher “a|b” enten “a” eller “b”.

  7. Tegnklasser: Tegnklasser giver mulighed for at matche specifikke grupper af tegn.

  8. “[abc]”: Matcher et enkelt tegn, der er enten “a”, “b” eller “c”.
  9. ”[^abc]”: Matcher et enkelt tegn, der ikke er “a”, “b” eller “c”.
  10. “[a-z]”: Matcher et enkelt tegn i det angivne tegninterval (i dette tilfælde alle små bogstaver).

  11. Gentagelseskvantifikatorer: Disse angiver gentagelser af et tidligere element.

  12. ”*” (stjerne): Matcher nul eller flere forekomster af det foregående element.
  13. ”+” (plustegn): Matcher én eller flere forekomster af det foregående element.
  14. ”?” (spørgsmålstegn): Matcher nul eller én forekomst af det foregående element.
  15. “{n}” (krøllede parenteser): Matcher præcis n forekomster af det foregående element.
  16. “{n, m}” (krøllede parenteser): Matcher mindst n og højst m forekomster af det foregående element.

Her er en tabel, der viser nogle af de mest brugte mønstre og deres betydning:

Mønster Beskrivelse
\d Matcher ethvert ciffer (0-9).
\w Matcher ethvert alfanumerisk tegn.
\s Matcher ethvert mellemrumstegn.
\b Matcher en ordgrænse.
\A Matcher starten af en tekststreng.
\Z Matcher slutningen af en tekststreng.
\d+ Matcher én eller flere cifre.
\w{3} Matcher præcis tre alfanumeriske tegn.
(abc) Grupperer mønstre til senere brug.
(abc|def) Matcher

Eksempler

Her er et par eksempler:

  1. Email-adresse:

    ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
    
    Dette regulære udtryk matcher en standard email-adresse. Det kræver, at adressen starter med en kombination af alfanumeriske tegn, understregninger, punktummer eller plus- og bindestreger, efterfulgt af “@”-tegnet. Derefter skal der være mindst et alfanumerisk tegn eller bindestreg, efterfulgt af en punktum og yderligere alfanumeriske tegn eller bindestreger.
  2. Dansk telefonnummer:

    ^(\+45)?(\d{8})$
    
    Dette regulære udtryk matcher et dansk telefonnummer. Det kan enten være et 8-cifret nummer eller et nummer, der starter med “+45” og efterfulgt af 8 cifre. Telefonnummeret kan være med eller uden mellemrum eller bindestreger.
  3. Dansk CPR-nummer:

    ^(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[01])(\d{2})(\d{2})(\d{2})$
    
    Dette regulære udtryk matcher et dansk CPR-nummer. CPR-nummeret består af 10 cifre, hvor de første seks cifre repræsenterer fødselsdatoen i DDMMÅÅ-format. Det første tal skal være mellem 01 og 31, det andet tal skal være mellem 01 og 12, og de sidste to tal repræsenterer fødselsåret. Resten af cifrene kan være vilkårlige tal.

Bemærk, at disse eksempler giver en grundlæggende validering af mønstrene og ikke tager højde for alle de kompleksiteter, der kan forekomme i de faktiske data. Avancerede valideringsregler og yderligere formatering kan være nødvendige afhængigt af dine specifikke behov.

RegEx cheatsheat(s)

Regex-klassen

I C# er System.Text.RegularExpressions.Regex-klassen en del af .NET, der giver en omfattende funktionalitet til arbejde med regulære udtryk. Denne klasse giver mulighed for at udføre forskellige operationer som validering, søgning og udtrækning af tekst ved hjælp af regulære udtryk.

For at bruge Regex-klassen i C#, skal du inkludere System.Text.RegularExpressions-namespace i dit program. Du kan derefter oprette en instans af Regex-klassen og bruge dens metoder til at udføre forskellige operationer.

Her er nogle af de vigtigste metoder, der tilbydes af Regex-klassen:

  • Match: Denne metode søger en given input-streng for et match til det angivne regulære udtryk. Den returnerer en Match-objekt, der indeholder information om det første match, der blev fundet.

  • Matches: Denne metode søger en given input-streng for alle forekomster, der matcher det angivne regulære udtryk. Den returnerer en MatchCollection, der indeholder alle matcher, der blev fundet.

  • Replace: Denne metode erstatter alle forekomster, der matcher det angivne regulære udtryk i input-strengen, med en angivet erstatningstekst.

  • Split: Denne metode opdeler en input-streng i et array af substrings baseret på det angivne regulære udtryk som adskillelsesmønster.

  • IsMatch: Denne metode returnerer en boolsk værdi, der angiver, om input-strengen indeholder et match til det angivne regulære udtryk.

For at bruge disse metoder skal du først oprette en instans af Regex-klassen ved at levere det ønskede regulære udtryk som parameter til konstruktøren. Du kan også angive yderligere flag eller indstillinger ved hjælp af RegexOptions-enumen.

Her er et eksempel på brugen af Regex-klassen i C#:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string input = "Hello, world!";
        string pattern = "world";

        Regex regex = new Regex(pattern);
        bool isMatch = regex.IsMatch(input);

        if (isMatch)
        {
            Console.WriteLine("Match found!");
            Match match = regex.Match(input);
            Console.WriteLine("Match value: " + match.Value);
        }
        else
        {
            Console.WriteLine("Match not found!");
        }
    }
}

I dette eksempel opretter vi en Regex-instans med det angivne mønster “world”. Vi bruger IsMatch-metoden til at kontrollere, om der er et match i input-strengen “Hello, world!”. Hvis der er et match, udskriver vi matchværdien ved hjælp af Match-objektet.

Opgaver