Programmeren in ASP.NET/Reguliere expressies
Reguliere expressies bieden een simpele en efficiënte manier om tekst te doorzoeken en te vervangen. Een reguliere expressie is een patroon waarmee je instelt waar je wil naar zoeken binnen een bestaande string. Ze werden oorspronkelijk ontwikkeld voor Perl en Unix, maar ondertussen vind je ze terug in veel moderne programmeertalen.
Dit kan je doen met reguliere expressies:
- controleren of een string aan een bepaald patroon beantwoordt
- een bepaald patroon in een string zoeken
- een bepaald patroon in een string één of meerdere malen vervangen of verwijderen
- delen van een string die aan een bepaald patroon voldoen uit de string halen.
Typische toepassingen zijn:
- validering van formulieren en andere gegevens
- oppoetsen en herformatteren van data
- doorzoeken van data
Een RegEx-object aanmaken
bewerkenJe maakt een nieuwe reguliere expressie door het zoekpatroon in de vorm van een string op te geven bij het aanmaken van een nieuw Regex-object:
Dim re As New Regex("[AEIOU]\w\w\w")
Deze expressie zoekt naar een string die begint met een klinker, gevolgd door 3 alfanumerieke karakters (het \w symbool). Het ziet er nogal cryptisch uit, maar je kan de regels heel snel leren. Veelgebruikte expressies vind je ook op Internet.
Bij het aanmaken van een RegEx-object mag je als tweede parameter opties opgeven.
Dim re As New Regex("[AEIOU]\w\w\w", RegexOptions.IgnoreCase)
Dit zijn de belangrijkste opties:
- Multiline: verandert de betekenis van ^ en $ (zie verder) zodat ze een match aan het begin (^) en aan het eind ($) van de regel vereisen, in plaats van aan het begin en eind van de ganse string.
- IgnoreCase: de controle maakt geen verschil tussen kleine letters en hoofdletters.
Een patroon aanmaken
bewerkenAls je binnen een tekst wil zoeken naar het woord "wiki", dan gebruik je gewoon de reguliere expressie:
New RegEx("wiki")
Herhalingsoperators
bewerkenTeken | Betekenis | Patroon | Voorbeelden | |||
---|---|---|---|---|---|---|
leeg | 3 | 33 | 333 | |||
geen | één keer het karakter | 3 | neen | ja | neen | neen |
? | nul keer of één keer het voorafgaande karakter | 3? | ja | ja | neen | neen |
+ | één keer of meer het voorafgaande karakter | 3+ | neen | ja | ja | ja |
* | nul keer of meer het voorafgaande karakter | 3* | ja | ja | ja | ja |
Jokerteken: het punt
bewerken. (punt) komt overeen met eender welk karakter (behalve een nieuwe regel)
Voorbeelden:
- A. komt overeen met een hoofdletter A gevolgd door eender welk ander karakter.
- A.+ komt overeen met een hoofdletter A gevolgd door één of meer karakters
- htm.? komt overeen met "htm" gevolgd door een optioneel karakter (zowel htm als html zullen voldoen)
Alternatieven met [ ]
bewerkenMet vierkante haken kan je een aantal alternatieven aangeven. Men noemt dit ook een karakterklasse. Een karakterklasse is een soort minitaal binnen een reguliere expressie. Met behulp van de - operator kan je zelfs een gans bereik aangeven.
Teken | Betekenis |
---|---|
[Cc] | hoofdletter of kleine letter c |
[A-Z] | eender welke hoofdletter van A tot en met Z |
[A-Za-z] | eender welke hoofdletter of kleine letter |
[0-9] | eender welk cijfer van 0 tot 9 |
[A-Za-z0-9] | eender welke letter of cijfer |
Als een karakterklasse begint met ^, dan heeft dit de betekenis van een negatie (dus: alles behalve hetgeen volgt)
Teken | Betekenis |
---|---|
[^0] | alles behalve het cijfer 0 |
[^aeiouAEIOU] | alles behalve een klinker |
Frequentie aangeven met accolades {}
bewerkenMet de {}-operators (accolades) kan je de frequentie van de voorafgaande expressie aangeven.
Er zijn 3 vormen:
- {exact_aantal_keer_dat_het_patroon_moet_voorkomen}
- {min_aantal_keer, max_aantal_keer }
- {min_aantal_keer, }
Voorbeelden:
Patroon | Betekenis | Voorbeeld |
---|---|---|
[A-Z][a-z]{3} | Een hoofdletter gevolgd door 3 kleine letters | Abcd |
[A-Z][a-z]{2,4} | Een hoofdletter gevolgd door minimaal 2 en maximaal 4 kleine letters | Abc, Abcd, Abcde |
[0-9]{4} | Exact 4 cijfers | 1234 |
.{3,8}\..{3} | 3 tot 8 karakters, gevolgd door een punt, en dan nog 3 karakters | command.com |
Hulpexpressies
bewerkenTeken | Betekenis |
---|---|
\w | alle woord-tekens (letters, cijfers of underscore) |
\W | alle niet-woord-tekens (letters, cijfers of underscore) |
\d | alle cijfers |
\D | alle niet-cijfers. |
\s | alle "witte ruimte"-tekens (spatie, tab, etc.) |
\S | alle niet-"witte ruimte"-tekens |
\b | alle woord-grenzen (spaties en leestekens) |
\r | carriage return |
\n | nieuwe regel (meestal samen met \r) |
\t | tabulator-teken |
Begin en einde
bewerkenTeken | Betekenis | Patroon | Voorbeeld |
---|---|---|---|
^ | Vereist een geslaagde vergelijking aan het begin van een tekenreeks. | ^abc | abc, abcdef, abc123 |
$ | Vereist een geslaagde vergelijking aan het einde van een tekenreeks. | abc$ | abc, 123abc |
Deze tekens voor begin en einde worden vooral gebruikt bij validering (controle of een string voldoet aan een bepaald patroon).
Met de multiline optie aan moet deze vergelijking slagen voor elke regel. Met de multiline optie af, moet de vergelijking alleen slagen aan het begin en einde van de ganse string.
Logisch of
bewerkenTeken | Betekenis | Patroon | Voorbeeld |
---|---|---|---|
a|b | Zoek a of b. | ja|nee | ja, nee |
Backslash
bewerkenDe backslash wordt gebruikt om tekens met een speciale betekenis aan te duiden.
\* | een * (geen herhaling) |
\+ | een + (geen herhaling) |
\? | een ? (geen herhaling) |
\. | een . (geen joker) |
\\ | een backslash |
\/ | een slash |
\( | een haakje |
enz...
Voorbeelden van patronen
bewerkenToepassing | Patroon | Voorbeelden |
---|---|---|
Alleen cijfers |
^\d+$ |
123412 |
Alleen kleine letters |
^[a-z]+$ |
testvoorbeeld |
Alleen letters of spaties |
^[a-zA-Z ]+$ |
Jan De Smet |
Ongevoelig voor hoofdletters + alleen letters of spaties |
(?i)^[a-z ]+$ |
Jan De Smet |
Bankrekeningnummer (België) |
^\d{3}-\d{7}-\d{2}$ |
123-4567890-12 |
Datum |
^(3[01]|0[1-9]|[12]\d)\/(0[1-9]|1[012])\/\d{4} |
15/06/2003 |
^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,6})+$ |
jan.smit@glo.be | |
Telefoonnummer (9 cijfers) |
^\d{9}$ |
016500404 |
Telefoonnummer met / |
^(0\d\/\d{7}|0\d{2}\/\d{6})$ |
016/500404 |
URL |
^(((ht|f)tps?)|mailto|news):\/{2}(\w+\.)*\w+\.\w{2,6}$ |
http://www.tv.be |
URL met path |
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? |
http://www.tv.be/nl/nws.htm#7 |
Meer voorbeelden vind je op www.regexlib.com
Methodes van het RegEx-object
bewerkenMatches()
bewerkenDeze methode geeft een MatchCollection-object terug, dit is de verzameling met alle gevonden "treffers". Nadat je het RegEx-object aangemaakt hebt, kan je een lus gebruiken om alle "treffers" op te sommen met behulp van de Matches-methode:
Dim strPatroon As String = "[AEIOU]\w\w\w" Dim re As New RegEx(strPatroon) Dim text As String = "Anne Bob Eric Fred" Dim m As Match For Each m In re.Matches(text) Label1.Text &= m.Value & " op de plaats " & m.Index & "<br>" Next
Het resultaat hiervan is:
Anne op de plaats 0 Eric op de plaats 9
Replace()
bewerkenAls je tekst wil vervangen door andere tekst, dan gebruik je Replace().
In dit voorbeeld wordt elk woord dat eindigt op ".NET" van kleur veranderd:
Dim strPatroon As String = "(\b[a-zA-Z\._]+?\.NET\b)" strTekst = "VB.NET en ASP.NET zijn onderdelen van het .NET framework." Dim strVervanging As String = "<b style='color: #FF0000'>.NET</b>" Dim strNieuweTekst As String = Regex.Replace(strTekst, strPatroon, strVervanging)
Split()
bewerkenSplit(strInvoer,reScheiding) geeft een array van strings door de invoerstring strInvoer te splitsen op de plaatsen waar de expressie reScheiding voorkomt.
Dim str() As String = Regex.Split("Dit is een test"," ")
geeft als resultaat 4 strings: "Dit", "is", "een" en "test".
IsMatch()
bewerkenIsMatch(strInvoer,reZoekterm) geeft True als de expressie reZoekterm voorkomt in de invoerstring strInvoer.
RegEx.IsMatch("Wikibooks", "iki")
geeft True.
Match()
bewerkenMatch(strInvoer,reZoekterm) geeft als resultaat een Match-object indien de invoerstring strInvoer de expressie reZoekterm bevat.
Ontwikkelen van reguliere expressies
bewerkenVaak is het handig om reguliere expressies te testen of te ontwikkelen door veel te testen. Een goede (gratis) regulier expressie ontwikkel- en test-platform is Expresso. Deze kan ook automatisch C#/VB.Net code genereren.
Meer informatie
bewerkenOefeningen
bewerken- Maak een formulier waar je een tekst kan ingeven. Na versturen toon je de tekst opnieuw, maar vervang overal het woord "boek" door "wikibooks".
- Maak een formulier waar je een HTML-tekst kan ingeven. Toon na submit de tekst 2 keer, 1 keer als HTML, en 1 keer met alle tags verwijderd (als platte tekst).