# 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

Je 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:
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.
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

Als je binnen een tekst wil zoeken naar het woord "wiki", dan gebruik je gewoon de reguliere expressie:

### Herhalingsoperators

| Teken | Betekenis | Patroon | Voorbeelden | Voorbeelden | Voorbeelden | 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

. (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 [ ]

Met 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

Met 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

| Teken | 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

| Teken | 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

| Teken | Betekenis | Patroon | Voorbeeld |
| a|b | Zoek a of b. | ja|nee | ja, nee |

### Backslash

De 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

| Toepassing | 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 |
| e-mail | ^\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 02/4112907 |
| 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
### Matches

Deze 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:
Het resultaat hiervan is:

### Replace

Als je tekst wil vervangen door andere tekst, dan gebruik je Replace.
In dit voorbeeld wordt elk woord dat eindigt op ".NET" van kleur veranderd:

### Split

Split(strInvoer,reScheiding) geeft een array van strings door de invoerstring strInvoer te splitsen op de plaatsen waar de expressie reScheiding voorkomt.
geeft als resultaat 4 strings: "Dit", "is", "een" en "test".

### IsMatch

IsMatch(strInvoer,reZoekterm) geeft True als de expressie reZoekterm voorkomt in de invoerstring strInvoer.
geeft True.

### Match

Match(strInvoer,reZoekterm) geeft als resultaat een Match-object indien de invoerstring strInvoer de expressie reZoekterm bevat.

## Ontwikkelen van reguliere expressies

Vaak 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

* http://msdn2.microsoft.com/en-us/library/ms972966.aspx

## Oefeningen

* 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).