Iteam
GitHub

Så får man regular expressions att returnera kortaste matchningen

Regular expressions (ingen riktigt bra svensk översättning finns, "reguljära uttryck" som används ibland känns mest som svengelska) är kanske det kraftfullaste verktyget för stränghantering en utvecklare har till sitt förfogande, men samtidigt det mest komplicerade.
Ett enkelt regular expression-mönster ser ut såhär:

"a.*g"

.* betyder matcha en sträng med vilka tecken som helst (.), valfritt antal gånger (*), så länge strängen omges av tecknen "a" och "g". "abcdefg" matchat mot mönstret ovan returnerar "abcdefg". "atgefhijkl" returnerar "atg". Problemet uppstår när omgivande tecken finns med fler gånger i strängen, eftersom * alltid matchar mot en så läng sträng den kan. Det betyder att strängen "abcdefghijklmnopqrstg" returnerar hela strängen, "abcdefghijklmnopqrstg". Ibland vill man ha det så, men ibland är det fel tolkning. När man använder ett regexp för att plocka ut HTML-taggar blir det fel t.ex.

Som tur är så finns det en variant av * som returnerar kortaste matchningen: ?. ? kallas ibland för "the lazy quantifier" och * för "the greedy quantifier".

Om man matchar "abcdefghijklmnopqrstg" mot "a.*?g" så får man ut den kortaste matchningen, "abcdefg".

Att det ofta blir fel kan bero på att många är vana vid att använda s.k. jokertecken (wildcards) som är en sorts budgetvariant av regexp. När man använder jokertecken finns bara * inte ?. Många programmerare är vana vid att använda jokertecken för att filtrera filnamn ("*.doc") men använder regular expressions mycket mer sällan.

.NETs motor för regular expressions fungerar i princip identiskt med Perls regular expressions, så det här är en bra referensmanual för regular expressions i .NET:

http://www.regular-expressions.info/reference.html

Anders Bornholm
2008-01-24