18 oktober 2008

Expressie

Gek ben ik erop, expressies. Vooral gangbare. 'Regular Expressions', zoals ze in het engels heten. Ik ben er niet zo goed in. Maar oh oh, wat zijn ze fijn, gangbare expressies. Dit wordt een stukje voor wannabe-nerds.

Mij is gevraagd om een script te wijzigen voor een klant. Geen toneelscript, nee, een computerscript. Zeg maar een lange lijst van instructies aan de computer. Enkele duizenden instructies. Van die paar duizend regels moest ongeveer de helft aangepast worden.

Waar bijvoorbeeld stond:
<tab><tab>Ding.SetColumn 0, "naampje1", 0 'dit was een instructie
<tab>Ding.SetFilter [SubInstructie("1,,F,"iets","yada bla",)]"), 0 'dit ook
<tab>Ding.SetFilter [SubInstructie("2,,F,"iets anders","pippi adriaan",)]"), 0


Moest worden:
<tab><tab>retval = Ding.SetColumn (0, "naampje1", 0) 'dit was een instructie
<tab>retval = Ding.SetFilter ([SubInstructie("1,,F,"iets","yada bla",)]"), 0) 'dit ook
<tab>retval = Ding.SetFilter ([SubInstructie("2,,F,"iets anders","pippi adriaan",)]"), 0


Denk daar eens over na. Je hebt bovenste set regels voor je, laten we zeggen in je Word document, en je moet onderste set regels zien te krijgen.

In eerste instantie zul je roepen: zoek-en-vervang. Ja, maar zo werkt het dus niet. Laat ik nog eens illustreren wat er precies gezocht en vervangen moet worden:
<tab><tab>retval = Ding.SetColumn (0, "naampje1", 0) 'dit was een instructie
<tab>retval = Ding.SetFilter ([SubInstructie("1,,F,"iets","yada bla",)]"), 0) 'dit ook
<tab>retval = Ding.SetFilter ([SubInstructie("2,,F,"iets anders","pippi adriaan",)]"), 0) 'dit ook


Dat is dus nog zo eenvoudig niet. Hoe vervang je die onderstreepte stukjes die ergens midden in een verder niet-gespecificeerde rij van karakters staan? Enig idee? Waarschijnlijk niet, tenzij je mijn beroepsdeformatie deelt.

Enter regular expressions.

Je vervangt simpelweg
\(\t+\)\(.+SetColumn \)\(.*0\) door \1retval = \2(\3), enzovoort.

Easy does it. Hell yeah :-) Het feit dat ik hier opgewonden van raak zegt waarschijnlijk meer over mij dan...nu ja, dat laat ik aan jullie.

Geen opmerkingen: