wijzig taal:

Reguliere expressies, ook wel genoemd Regular Expressions, regexp, regex of RE, zijn een manier om een patroon te omschrijven waaraan een tekststring moet voldoen. Reguliere expressies werden in de jaren 50 van de vorige eeuw ontwikkeld en worden nog steeds door de meeste programmeertalen ondersteund. Ook in VBA kunnen reguliere expressies gebruikt worden. Bekende varianten van een reguliere expressie zijn de jokertekens of wildcards (* en ?) die kunnen worden gebruikt om te zoeken naar bijvoorbeeld bestandsnamen. Reguliere expressies zijn onder andere geschikt om de invoer van gegevens op bijvoorbeeld formulieren te controleren op juistheid. Het grote voordeel van reguliere expressies is dat met slechts een paar regels code eenvoudige tot hele complexe invoercontroles kunnen worden uitgevoerd. Voor eenvoudige syntax controles kan in VBA ook het Like-statement gebruikt worden, maar reguliere expressies zijn veel veelzijdiger. In deze tutorial zal uitgelegd worden hoe reguliere expressies gemaakt kunnen worden en wat er vervolgens mee gedaan kan worden. Dit zal vooral gedaan worden aan de hand van een paar voorbeelden. De intentie hier is niet om een compleet overzicht te geven van alle mogelijkheden reguliere expressies. Het is meer bedoeld als een eerste kennismaking.

Postcode check

Reguliere expressies hebben een speciale syntax, waarbij een aantal karakters een speciale rol spelen. In deze paragraaf zal eerst een eenvoudig voorbeeldje worden gepresenteerd voor het checken van de invoer van een Nederlandse postcode. Daaraan is te zien hoe reguliere expressies kunnen worden aangeroepen in VBA. In de volgende paragraaf zal de syntax uitgebreider behandeld worden. De VBA-code van de functie om de invoer van een postcode te checken luidt al volgt:

Function CheckPostcode(PostCode As String) As Boolean
    With CreateObject("vbscript.regexp")
        .Pattern = "^[1-9][0-9][0-9][0-9] [A-Z][A-Z]$"
        CheckPostcode = .Test(CStr(PostCode))
    End With
End Function

Zoals te zien is, is de code erg kort. Om gebruik te kunnen maken van reguliere expressies in VBA moet deze objectbibliotheek beschikbaar worden gemaakt. Dit kan door middel van het aanvinken van deze bibliotheek in de Visual Basic Editor onder de tab Extra → verwijzingen of, zoals in dit voorbeeld is gedaan, door middel van zogenaamde late binding. Dat wil zeggen dat de objectbibliotheek tijdens het uitvoeren van de functie wordt geladen. Dit gebeurt op de eerste regel van de functie. Vervolgens wordt bij Pattern de reguliere expressie ingesteld, waarna door middel van de methode Test wordt gecheckt of de opgegeven postcode voldoet aan de reguliere expressie. Zo ja, dan geeft de functie WAAR terug, zo nee dan ONWAAR. De reguliere expressie die in bovenstaande functie bij Pattern gebruikt is kan nog korter, maar het is makkelijker om eerst de uitgebreidere variant te bespreken. De verkorte versie komt in de volgende paragraaf aan bod. De reguliere expressie begint met een ^ en eindigt met een $. Hiermee wordt aangegeven dat de expressie betrekking heeft op het gehele woord en niet op een gedeelte daarvan. Daarna wordt aangeven dat de postcode eerst moet bestaan uit 4 willekeurige getallen tussen 0 en 9, waarbij het eerste getal geen nul mag zijn. Vervolgens moet een spatie volgen en daarna twee willekeurige hoofdletters. Elke postcode die voldoet aan dit patroon krijgt de waarde WAAR en elke andere postcode de waarde ONWAAR.

Syntax

Zoals al te zien was in voorgaand voorbeeld, hebben reguliere expressies een eigen syntax. Voordat nog een aantal voorbeelden worden besproken is het goed om eerst deze syntax te bespreken. In deze syntax hebben een aantal karakters een speciale betekenis. De belangrijkste zijn:

  • [ ] vierkante haken: worden gebruikt om een lijst met tekens toe te staan. Met bijvoorbeeld [pqr] wordt de letter p, q óf r toegestaan. Met een min-teken kan verwezen worden naar een reeks van tekens, zoals in bovenstaand voorbeeld [0-9] en [A-Z].
  • ( ) ronde haken: tekens tussen ronde haken geven een patroon aan. Bijvoorbeeld h(oo|aa)r herkent hoor en haar.
  • | pipe: scheidingsteken voor patronen
  • { } accolades: het getal tussen accolades geeft aan hoe vaak het voorgaande moet worden herhaald. 0{5} betekent dus 00000. Er kan ook een minimum en maximum aangegeven worden met {min,max}. Dus k{2,4} herkent kk, kkk en kkkk
  • ^ dakje: begin van een regel én, als het gebruikt wordt binnen vierkante haken, komt het overeen met NIET. Dus [^g] betekent alle tekens behalve de letter g, [^0-9] betekent alles behalve een getal.
  • $ dollar teken: eind van een regel.
  • . punt: staat voor een willekeurig teken.
  • + plusteken: geeft aan dat het voorafgaande teken ten minste één keer voor moet komen. Bijvoorbeeld bo+m herkent bom, boom, booom enz.
  • ? vraagteken: geeft aan dat het voorafgaande teken ten hoogste één keer voor mag komen. Bijvoorbeeld br?om herkent brom en bom.
  • * sterretje: geeft aan dat het voorafgaande teken nul of meer kan kan komen. Bijvoorbeeld 10*1 herkent 11, 101, 1001, 10001 enz.
  • \ backslash: als één van de speciale karakters gebruikt moet worden als normaal karakter, dan dient deze vooraf gegaan worden door een backslash. Daarnaast wordt de backslash gebruikt voor een aantal verkorte codes:
    • \d: komt overeen met een willekeurig getal en is hetzelfde als [0-9].
    • \w: komt overeen met een willekeurige karakter. Dat komt overeen met [a-zA-Z0-9_], dus alle letters en getallen inclusief underscore.
    • \s: betekent witruimte. Dit kan bijvoorbeeld een spatie, tab of linefeed zijn.

Op basis van deze syntax kan de reguliere expressie voor de postcode "^[1-9][0-9][0-9][0-9] [A-Z][A-Z]$" verkort worden tot "^[1-9]\d{3} [A-Z]{2}$". Als ook kleine letters in de postcode toegestaan zijn dan kan de expressie veranderd worden in "^[1-9]\d{3} [a-zA-Z]{2}$". Een andere mogelijkheid is om in plaats daarvan de volgende coderegel toe te voegen: .IgnoreCase = True. Deze regel moet voor de regel met CheckPostcode geplaatst worden.

Voorbeelden

Hierna volgen een aantal voorbeelden van reguliere expressies. Deze expressies kunnen eenvoudig in onderstaande VBA functie worden ingepast. Het enige wat moet gebeuren is de expressie achter .Pattern= in te voegen. Als verschillende checkfuncties nodig zijn, geef dan elke functie een eigen naam.

Function CheckSyntax(TextString As String) As Boolean
    With CreateObject("vbscript.regexp")
        .Pattern = ""
        CheckSyntax = .Test(CStr(TextString))
    End With
End Function

Voorletters: "^([A-Z][a-z]?\.){1,5}$"

Deze expressie checkt de invoer van voorletters van een naam. Dit mogen minimaal 1 tot maximaal 5 voorletters zijn. Elke letter moet gevolgd worden door een punt. Elke voorletter moet een hoofdletter zijn. Deze hoofdletter kan eventueel gevolgd worden door een kleine letter. Dus toegestaan zijn bijvoorbeeld: W.A. en A.F.Th. Niet toegestaan zijn bijvoorbeeld A.F.TH, g.h. en GH.

IBAN: "^NL\d{2} [A-Z]{4} 0\d{9}$"

Deze expressie checkt de syntax van een Nederlands IBAN-nummer. Dus eerst de letters NL gevolgd door 2 willekeurige cijfers. Daarna een spatie gevolgd door 4 hoofdletters, vervolgens een spatie gevolgd door een nul en 9 getallen. Uiteraard betreft dit alleen een eenvoudige syntaxcheck. Dit geeft nog geen garantie dat het een bestaand geldig IBAN-nummer is.

Geboortejaar: "^(19\d\d|20(0\d|1[0123]))$"

Hier wordt de invoer van een geboortejaar gecheckt. Dit mag zijn 19 gevolgd door 2 willekeurige getallen, óf 20 gevolgd door óf 0 en een getal óf 1 gevolgd door 0,1,2, of 3. Dus een opgegeven geboortedatum is in dit geval alleen geldig als dit ligt tussen 1900 en 2013.

E-mail adres: "^[A-Za-z0-9._%+-]+@([A-Za-z0-9+-]+\.)+[A-Za-z]{2,4}$"

Voor de @ mogen één of meer van de volgende karakters voorkomen: A-Z, a-z, 0-9, . _ % + -. Dit moet minimaal één karakter zijn. Na de @ mogen A-Z, a-z, 0-9, +,- voorkomen. Dit moet minimaal één karakter zijn. Zo’n karakterserie moet worden afgesloten met een punt. Er mogen meerdere punten voorkomen, maar voor elke punt moet minimaal één van de genoemde karakters staan. Dus Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. en Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. voldoet, maar Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. voldoet niet (vanwege de 2 opvolgende punten). Vervolgens komt de hoofddomeinnaam die uit minimaal 2 en maximaal 4 letters moet bestaan. Deze expressie werkt voor vrijwel elk e-mail adres, behalve voor topleveldomeinen met meer dan 4 letters. Desgewenst kan de expressie met geldige langere topleveldomeinen, zoals travel en museum, uitgebreid worden:

"^[A-Za-z0-9._%+-]+@([A-Za-z0-9+-]+\.)+([A-Za-z]{2,4}|museum|travel)$"

Aangezien nog steeds de meeste domeinnamen een extensie van 2 letters hebben zou ook voor de volgende expressie gekozen kunnen worden:

"^[A-Za-z0-9._%+-]+@([A-Za-z0-9+-]+\.)+([A-Za-z]{2}|com|info|net|org)$"

Er is hier gekozen voor het toevoegen van de vier meest voorkomende hoofddomeinen die uit meer dan 2 letters bestaan. Hiermee wordt verreweg het grootste deel van de e-mail adressen herkend. Desgewenst kunnen de andere hoofddomeinnamen ook toegevoegd worden. Het voordeel van de laatste expressie is dat er minder kans is op het goedkeuren van niet bestaande hoofddomeinnamen. In de eerste expressie worden namelijk alle hoofddomeinnamen van 2, 3 en 4 letters goedgekeurd. In de laatste expressie worden alle hoofddomeinnamen van 2 letters goedgekeurd plus nog vier benoemde hoofddomeinen die uit meer letters bestaan. Er kan ook voor gekozen worden om alle hoofddomeinen expliciet te benoemen.

Ten slotte

In deze tutorial zijn de basisbeginselen van reguliere expressies aan de orde geweest. Hiermee kunnen op relatief eenvoudige wijze zeer complexe invoerchecks gemaakt worden. Als dat zonder reguliere expressies geprogrammeerd zou moeten worden, dan zou dat in veel gevallen uitgebreide complexe code moeten worden. Met reguliere expressies betreft dit maar een paar regeltjes code. Met reguliere expressies is nog veel meer mogelijk, maar het voert te ver om dat in deze tutorial te behandelen.

Vragen / suggesties

Hopelijk heeft dit artikel geholpen bij het begrijpen en toepassen van reguliere expressies in VBA. Als er verdere vragen over dit onderwerp zijn of suggesties voor verbetering, plaats dan een reactie hieronder.

arrow_up