Met behulp van regular expressions kun je eenvoudig informatie vinden in een tekst. Voor je meeste zoek opdrachten zal een simpele ‘search’ volstaan, maar zodra je geen 1:1 zoek-patroon hebt bieden regular expressions een uitkomst. Ik heb regular expressions o.a. gebruikt in mijn vorige blog waarbij ik uitlegde hoe ik de gaswaarde uit de byte-stream van mijn slimme meter uitlees.

Bij regular expressions is alles een patroon. Wanneer je zoekt naar de string “zoek” dan zoek je in feite naar een patroon dat opgebouwd is uit de karakters z, o, e en k.

Meta karakters

Als je niet alle zoek karakters weet of onbekend zijn dan kun je zogenaamde meta karakters gebruiken:

.     : elk karakter inclusief de spatie
[…]   : elk karakter tussen de haken
[^…]  : elke karakter behalve degene tussen de haken
[a-f] : elk karakter in de range a-f

Voorbeelden
zoek[01234] matcht met “zoek1”, “zoek3”, maar niet met “zoek6”
zoek[0-4] doet hetzelfde
zoek[0-9a-zA-Z] matcht met “zoek” gevolgd door elk willekeurig numeriek of alfanumeriek karakter

Om speciale karakters te vinden moet je deze vooraf laten gaan door een \

\. \* \\ : voor de . * en \
\t \n \r : tab, linefeed, carriage return
\tu00A9  : unicode escape

Macro’s

Vaak kun je macro’s gebruiken voor je regular expression. Het is afhankelijk van je applicatie welke macro’s worden ondersteund.

\w : voor woord
\d : voor digit
\s : voor witruimte

Quantifiers

Naast voorgaande zaken is het soms handig als je kunt aangeven hoe vaak een bepaalde template moet voorkomen. Daarvoor kun je zogenaamde quantifiers gebruiken:

?         : voorgaande karakter 0 of 1 keer
*         : voorgaande karakter 0 of meerdere keren
+         : voorgaande 1 of meerdere keren
{N}       : voorgaande N keren
{min,max} : voorgaande tussen min of max keren

Voorbeeld:
z+oek matcht met “zoek” en “zzzoek”
zo?ek matcht met “zoek” en “zooek” maar niet met “zoooek”
z.*k matcht alles wat begint met een ‘z’ en eindigt op ‘k’
zoek[0-9]{3} matcht met “zoek123”, “zoek456” maar niet met “zoek1000”

Anchors

Vaak wil je ook aangeven op welke positie iets begint. Je geeft dit aan door middel van zogenaamde anchors.

^  : begin van de regel
$  : einde van de regel
\  : einde van een woord
\b : begin of het einde van een woord
\B : elke karakter dat niet aan het begin of aan het einde van een woord staat

Alternatieven

Soms wil je iets aanduiden met een “of” operator : zoek naar “zoek” of “vind”. Dit doe je met het “|” teken. Let erop dat er geen spaties tussen staan

Voorbeeld:
zoek|vind : matcht met “zoek” en “vind”

Groepering

Haakjes maken een eenheid van het patroon waar ze omheen staan, bijvoorbeeld “(va|moe)der” is hetzelfde als “vader|moeder” en “(groot)?vader” herkent zowel “vader” als “grootvader”.

() : groepeert een groep
[] : groepert een karakter bereik
{} : groepert een herhalings opgave

Voorbeeld:
/([0-9]{4}([- ])*){2}[0-9]{4}/ : matcht een nummer bestaande uit 12 digits gegroepeerd in 3 delen (elk 4 digits) gescheiden door optionele “-” of ” “.

Zoek en vervang

Zoeken en vervangen gaat ook heel eenvoudig. Stel je wilt “zoek” vervangen door “vervang”. Je schrijft dan “s/zoek/vervang/g”. De ’s’ staat dan voor ‘substitute’ en de ‘g’ staat voor ‘global’.

Voorbeeld:
s/ / /g : verander een of meer spaties in een enkele spatie
s/ *$/ /g : haal alle spaties aan het einde van een regel weg
s/^/ /g : voeg een spatie toe aan het begin van elke regel
s/^[0-9][0-9]
//g : haal alle nummers aan het begin van elke regel weg

Het bovenstaande is slechts een zeer summiere uitleg wat er allemaal kan met regular expressions en zeker niet volledig. Je kunt nog zoveel meer (denk aan backreferences, modifiers, etc). Dit is een goede site om meer over regular expressions te leren en te experimenteren en zou ik zeker eens bekijken. Veel plezier!