{"id":155,"date":"2008-07-15T12:31:04","date_gmt":"2008-07-15T11:31:04","guid":{"rendered":"http:\/\/www.nielsgamborg.dk\/wordpress\/programmering\/regulaere_udtryk_regular_expressions.htm"},"modified":"2008-07-15T12:31:04","modified_gmt":"2008-07-15T11:31:04","slug":"regulaere_udtryk_regular_expressions","status":"publish","type":"post","link":"https:\/\/nielsgamborg.dk\/wordpress\/programmering\/regulaere_udtryk_regular_expressions.htm","title":{"rendered":"Regul\u00e6re udtryk. Regular expressions"},"content":{"rendered":"<p>Regul\u00e6re udtryk er den danske overs\u00e6ttelse af regular expressions (forkortes ofte RegEx)\u00a0.<\/p>\n<p>Regul\u00e6re udtryk er et\u00a0meget kraftfuldt programmeringsredskab. Regul\u00e6re udtryk bruges til at matche patterns, m\u00f8nstre og s\u00f8geord i tekststrenge. Ofte kan samme resultater opn\u00e5es med de ordin\u00e6re streng funktioner eller\u00a0streng metoder, som de forskellige programmeringssprog stiller til r\u00e5dighed. Men n\u00e5r de s\u00f8gninger eller matchninger, man skal foretage bliver\u00a0 komplekse, er det\u00a0smart at bruge regul\u00e6re udtryk.\u00a0 Regular expressions kan spare os for mange liniers kode.<!--more--><\/p>\n<h3>Regul\u00e6re udtryk\u00a0.\u00a0Praktisk brug<\/h3>\n<p>Vi kan blandt andet bruge regul\u00e6re udtryk til at sammenligne, redigere eller manipulere\u00a0 specifikke m\u00f8nstre eller tegnkarakterer i tekststrenge.<br \/>\nRegul\u00e6re udtryk kan bruges til en m\u00e6ngde forskellige form\u00e5l, n\u00e5r det g\u00e6lder behandling eller analyse, blandt andet:<\/p>\n<ul>\n<li>Validering af brugerinput i formular felter.\n<ul>\n<li>Best\u00e5r telefonnummer udelukkende af\u00a0cifre?<\/li>\n<li>Er der indtastet et @ i emailadressen?<\/li>\n<li>Er der angivet et husnummer i adressen?<\/li>\n<\/ul>\n<\/li>\n<li>Erstatning af tegn i brugerinput.\n<ul>\n<li>F.eks. fjernelse af bindestreger og mellemrum i personnumre eller telefonnumre.<\/li>\n<\/ul>\n<\/li>\n<li>Manipulering at strenge fra andre kilder.\n<ul>\n<li>F.eks. genbrug at database data til andre form\u00e5l, hvor man har behov for at fjerne visse karakterer.<\/li>\n<li>RSS feeds, hvor man vil udelukke eller erstatte indhold i feeden.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Regul\u00e6re udtryk. En oversigt\u00a0<\/h3>\n<p>Regul\u00e6re udtryk\u00a0\u00a0kan deles \u00a0op i 2 typer\u00a0af tegn .<\/p>\n<ul>\n<li>Almindelige tegn, der har deres p\u00e5lydende v\u00e6rdi. Et &#8220;\u00f8&#8221; er alts\u00e5 et \u00f8, og et punktum er et punktum.<\/li>\n<li>Metategn, der har en anden\u00a0betydning end deres p\u00e5lydende. Et punktum betyder\u00a0f.eks. \u00a0ikke punktum, men er et jokettegn.<\/li>\n<\/ul>\n<h4>Almindelige tegn<\/h4>\n<p>De almindelige tegn udtrykker som sagt deres p\u00e5lydende v\u00e6rdi.\u00a0Noget af det mest\u00a0interessante ved regul\u00e6re udtryk er, at man kan samle karakterene i klasser.<\/p>\n<p>Karakterklasser defineres i firkantparanteser. F.eks. vil [abc] vil matche et af bogstaverne\u00a0 a,b\u00a0eller c. Det samme vil [a-c].<\/p>\n<p>Danske karaktere i\u00a0regul\u00e6re udtryk\u00a0er ikke noget problem. Skal man matche dansk tegns\u00e6t med f.eks: \u00e6, \u00f8 og \u00e5, skriver du dem bare ind i karakterklasserne. [A-Z\u00c6\u00d8\u00c5a-z\u00e6\u00f8\u00e5_0-9]\u00a0 matcher p\u00e5 den m\u00e5de b\u00e5de store og sm\u00e5 bogstaver i det danske alfabet, underscore og ciffrene 0-9.<\/p>\n<p>Udover de klasser vi selv kan definere, findes ogs\u00e5 en r\u00e6kke klasser af karakterer, der allerede er defineret. Det g\u00e6lder f.eks. \\d som er det samme som [0-9] eller\u00a0\\w\u00a0som er det samme som\u00a0[A-Za-z_0-9] . Backslashen foran henholdsvis d og w er et escape tegn, der betyder at vi ikke skal bruge d&#8217;s eller w&#8217;s p\u00e5lydende v\u00e6rdi.<\/p>\n<h4>Metategn<\/h4>\n<p>Metategn har en anden v\u00e6rdi end den p\u00e5lydende. F.eks. betyder\u00a0 \u201d^\u201d undtagen, s\u00e5 \u00a0[^\u00e6\u00f8\u00e5\u00c6\u00d8\u00c5] er alts\u00e5 alle tegn\u00a0undtagen \u00e6\u00f8\u00e5 og \u00c6\u00d8\u00c5.<\/p>\n<blockquote><p><strong>Metategn i regul\u00e6re udtryk<\/strong><\/p>\n<p>. Matcher 1 vilk\u00e5rlig karakter.<br \/>\n^ Matcher starten p\u00e5 en linie.<br \/>\n[^] Matcher alle karakter <strong>undtagen<\/strong> de n\u00e6vnte.<br \/>\n$ Matcher slutningen af en linie.<br \/>\n? Matcher det foranst\u00e5ende element 0 eller 1 gang.<br \/>\n+ Matcher det foranst\u00e5ende element\u00a01 eller\u00a0flere gange.<br \/>\n* Matcher det foranst\u00e5ende element 0, 1 eller flere gange.<br \/>\n| Matcher <strong>enten<\/strong> udtrykker f\u00f8r <strong>eller<\/strong> efter stregen.<\/p>\n<p>Hvis man vil matche et metategns p\u00e5lydende v\u00e6rdi skal man escape det. F.eks. vil [\\?] macthe et sp\u00f8rgsm\u00e5lstegn.<\/p><\/blockquote>\n<p>De forskellige programmeringsprog benytter sig nogle gange af lidt forskellige metategn, men overordnet set er b\u00e5de syntaks og metategn meget lig hinanden.<\/p>\n<h3>Regul\u00e6re udtryk i JavaScript<\/h3>\n<p>I\u00a0JavaScript er\u00a0indbygget flere funkioner, der benytter sig af regul\u00e6re udtryk.<\/p>\n<p>Her er et simpelt eksempel, der fjerner mellemrum og bindestreger fra en brugers input af et cpr-nummer.<\/p>\n<blockquote><p>streng = &#8220;01 01 74-1317&#8221;;<br \/>\nny_streng = streng.replace(\/[ -]\/g, &#8220;&#8221;);<\/p><\/blockquote>\n<p>JavaScripts brug af regul\u00e6re udtryk bygger p\u00e5 regular expressions i perl, og bruger derfor samme syntaks. Matchen er pakket ind\u00a0mellem 2 slashes. Det lille g bag udtrykket angiver, at tegnene i karakterklassen skal skiftes ud <strong>alle<\/strong> steder, de optr\u00e6der i strengen.\u00a0<\/p>\n<p>Bem\u00e6rk ogs\u00e5 at en bindestreg i en karakterklasse skal enten escapes med backslash, eller st\u00e5 f\u00f8rst eller sidst i klassen, for at have betydningen &#8220;bindestreg&#8221;. Ellers vil den have betydning &#8220;til&#8221; som i [0-9].<\/p>\n<h3>Regul\u00e6re udtryk i PHP<\/h3>\n<p>I PHP er brugen af regul\u00e6re udtryk indeholdt i standard bilbiotekerne og skal derfor heller ikke importeres p\u00e5 nogen m\u00e5de.<\/p>\n<p>Eksemplet\u00a0viser, hvordan man kan strippe image-tags fra tekststrenge med regular expressions.<\/p>\n<blockquote><p>$streng = &#8220;Et billede &lt;img src=&#8217;billede.jpg&#8217; alt=&#8217;billede &#8216;\/&gt; siger mere end \u00a0tusinde ord&#8221;;<br \/>\n$ny_streng\u00a0= ereg_replace(&#8220;&lt;img[^&gt;]*&gt;&#8221;,&#8221;&#8221;, $streng);<\/p><\/blockquote>\n<p>F\u00f8rst laves en ordin\u00e6r match p\u00e5 substrengen &#8220;&lt;img&#8221;. Dern\u00e6st\u00a0er der en karakterklasse, der indeholder <strong>alle<\/strong> tegn \u00a0undtagen &#8220;&gt;&#8221;. &#8220;*&#8221; angiver\u00a0at indholdet af karakterklassen optr\u00e6der et vilk\u00e5rligt antal gange.\u00a0Slut i matchen optr\u00e6der slut-tagget &#8220;&gt;&#8221;. Det hele erstattes af en tom streng.<\/p>\n<p>Alternativt kan man istedet benytter preg_replace-funktionen. Preg st\u00e5r for &#8220;Perl regular expressions&#8221;\u00a0og angiver at man i preg-replace() benytter perl syntaks for regul\u00e6re udtryk. Det betyder i praksis, at matchen pakkes ind i to slashes. Udtrykket kommer\u00a0derfor til at se s\u00e5dan ud:<\/p>\n<blockquote><p>$ny_streng\u00a0= preg_replace(&#8220;\/&lt;img[^&gt;]*&gt;\/&#8221;,&#8221;&#8221;, $streng);<\/p><\/blockquote>\n<h3>Regul\u00e6re udtryk i Java<\/h3>\n<p>For at bruge regul\u00e6re udtryk\u00a0\u00a0i Java, skal man f\u00f8rst importere\u00a0 java.util.regex, hvor regular expressions metoderne findes.<\/p>\n<p>Brugen af regul\u00e6re udtryk i Java adskiller sig fra de andre sprog ved at backslash selv er et metategn, og derfor ogs\u00e5 skal escapes,\u00a0 n\u00e5r\u00a0man skal escape andre metategn. Det vil sige, at hvis man f.eks. vil escape et\u00a0sp\u00f8rgsm\u00e5lstegn skal man bruge 2 backslashes foran sp\u00f8rgsm\u00e5lstegnet.<\/p>\n<p>Her er et simpelt eksempel, der viser hvordan man erstatter sp\u00f8rgsm\u00e5lstegn, udr\u00e5bstegn og semikolon med punktummer.<\/p>\n<blockquote><p>import java.util.regex.*;<br \/>\nString\u00a0streng =\u00a0 &#8220;Dette er en streng? Strengen er kort!&#8221;;<br \/>\nString\u00a0ny_streng\u00a0 =\u00a0 streng.replaceAll(&#8220;[\\\\?!;]&#8221;,&#8221;.&#8221;);<\/p><\/blockquote>\n<p>replaceAll()\u00a0 metoden erstatter alle\u00a0forekomsterne af\u00a0tegnene i strengen.<\/p>\n<h3>Regul\u00e6re udtryk i Python<\/h3>\n<p>For et bruge regul\u00e6re udtryk i Python skal man f\u00f8rst importere regular expressions\/regex modulet.\u00a0<\/p>\n<p>Eksemplet fjerner paranteser, apostroffer og\u00a0anf\u00f8selstegn fra en streng ved at erstatte dem med en tom streng.<\/p>\n<blockquote><p>import re\u00a0<br \/>\nstreng = &#8220;Her er en (kort) &#8216;streng&#8217;.&#8221;<br \/>\nny_streng\u00a0= re.sub(&#8220;[\\(\\)\\&#8217;\\&#8221;,]&#8221;,&#8221;&#8221;,streng)\u00a0<\/p><\/blockquote>\n<p>Bem\u00e6rk alle backslashene i det regul\u00e6re udtryk. De escaper karakterne, der\u00a0alle er metategn.<\/p>\n<h3>Mere om regular expression<\/h3>\n<p>Her kan du finde mere om <a title=\"Regular expressions - regex\" href=\"http:\/\/www.regular-expressions.info\/\">regular expressions<\/a>\u00a0. B\u00e5de regular expressions\u00a0generelt og deres brug i forskellige programmeringssprog.<\/p>\n<p>P\u00e5 wikien kan du ogs\u00e5 finde en fremragende oversigt over\u00a0<a title=\"regular expressions\" href=\"http:\/\/en.wikipedia.org\/wiki\/Regular_expression\">regular expressions<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Regul\u00e6re udtryk er den danske overs\u00e6ttelse af regular expressions (forkortes ofte RegEx)\u00a0. Regul\u00e6re udtryk er et\u00a0meget kraftfuldt programmeringsredskab. Regul\u00e6re udtryk bruges til at matche patterns, m\u00f8nstre og s\u00f8geord i tekststrenge. Ofte kan samme resultater opn\u00e5es med de ordin\u00e6re streng funktioner eller\u00a0streng metoder, som de forskellige programmeringssprog stiller til r\u00e5dighed. Men n\u00e5r de s\u00f8gninger eller matchninger, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11],"tags":[141,142,203,210,213,217,219,218],"_links":{"self":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts\/155"}],"collection":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/comments?post=155"}],"version-history":[{"count":0,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/posts\/155\/revisions"}],"wp:attachment":[{"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/media?parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/categories?post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nielsgamborg.dk\/wordpress\/wp-json\/wp\/v2\/tags?post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}