Hier vind je de basis van werken met reguliere expressies, ik geef er ook de Engelstalige termen bij zodat je gemakkelijker kan gaan Googlen om er meer over te leren. Je kan ook perfect aan ChatGPT e.d. vragen om voor een bepaald geval een regex te maken, of om een regex uit te leggen of om een fout in een regex te zoeken.

Ik wou dit al lang schrijven, maar was nu geïnspireerd door Martijn Aslanders post Grep – het krachtigste informatiegereedschap dat er bestaat maar onbekend bij velen.

Als voorbeeld gebruik ik hier reguliere expressies om te zoeken in een map met bidprentjes die geïndexeerd zijn met IndexScans. IndexScans maakt niet alleen een indextabel met namen, plaatsen en datums (in een csv bestand), maar slaat ook de volledig OCR tekst van elk prentje op als txt bestand.

Je kan dus ook gewoon gaan zoeken in de volledige tekst van je geïndexeerde bidprentjes.

Om dat efficiënt te doen gebruik je een command-line tool zoals grep (op MacOS en Linux), of Select-String (in PowerShell op Windows). Je opent daarvoor eerst een terminal venster. In Windows zoek je in het zoekveld naar PowerShell, en opent dat. Daarin tik je de commando’s (of plakt ze met toetsencombinatie CTRL+V, als je ze ergens gekopieerd hebt).

Als je schrik hebt van de command-line kan je dit ook doen in een Windows programma zoals GrepWin.

Ik geef de voorbeelden voor Select-String, maar die werken net zo bij grep (als je op een Mac werkt vraag je aan ChatGPT om het commando om te zetten). De structuur van het commando is als volgt:

Select-String <patroon> <pad met bestanden>

Het pad met bestanden kan één sepcifiek bestand zijn, bvb “D:\tmp\testbatch PE\BP0476098.txt”.
Of een pad met een wildcard-patroon, zoals je ook bij zoeken in Windows verkenner kan gebruiken. Bvb “D:\tmp\testbatch PE\BP*.txt”, dat gaat zoeken in alle bestanden in de map “D:\tmp\testbatch PE” die beginnen met BP en eindigen met .txt.
*.* zou zoeken in alle bestanden, met alle extensies (dus ook in .pdf, .docx, .exe, .csv, …), maar meestal is dat teveel. Zoeken heeft alleen nut in platte tekst bestanden zoals txt of csv.

Zoek de naam Neerinck in alle bestanden

Select-String 'Neerinck' "D:\tmp\testbatch PE\BP*.txt"

Zoek datums in alle bestanden

Select-String '\d\d? \w+ \d{4}' "D:\tmp\testbatch PE\BP*.txt"

Zoek alle varianten van de naam Smet

Wil je spellingsvarianten van een naam zoeken? Dat kan met veel gedetailleerder wildcards dan de * en ? die je misschien kent.

Je kan zelf een set van letters kiezen die moet matchen, bvb “[dt]” zal zowel een d als een t matchen.
Nu wil ik niet alleen Smet en Smed, maar ook Smedt, en eventueel foute spellingen zoals Smett of Smetd.
De eenvoudigste manier is aangeven dat de hele set (d en t) één of meer keer na elkaar mag voorkomen. Het teken daarvoor is een +, die je erachter zet. Je kan ook een ? gebruiken, dat betekent 0 of 1 keer, of een *, dat betekent 0 of meer keer.
Hiermee ga ik ook Smetttdtdtdttdtdt matchen, als dat een probleem is dan beperk je het aantal exact zoals je wil met {min,max}:
[dt]{1,2}, dan moet de d of t één keer voorkomen, en mag de d of t maximaal 2 keer voorkomen.

Aantallen

? -> 0 of 1
+ -> 1 of meer
* -> 0 of meer
{min,max} -> minstens min keer, hoogstens max keer

Ik wil ook Smets en varianten, dus ik zet er nog een “s?” achter.

Select-String 'Sme[dt]+s?' "D:\tmp\PAT_060\PAT*.txt"

Je krijgt nu ook woorden zoals “Herinneringsmedaille”, die ook smed bevatten.

Dan kan je denken, ok, dan zet ik er een spatie achter:

Select-String 'Sme[dt]+s? ' "D:\tmp\PAT_060\PAT*.txt"

Maar dan krijg je nog maar 3 resultaten: geen Smet op een regeleinde, geen Smet met een punt of komma erachter. Want er moet nu een spatie achter staan!

Gelukkig heeft regex een karakterklasse (character class) voor zo’n gevallen: \b (woordgrens – word boundary)

Select-String 'Sme[dt]+s?\b' "D:\tmp\PAT_060\PAT*.txt"

Als je er ook de Smits varianten bij wil, gebruik je de set “[ei]” ipv “e”:

Select-String 'Sm[ei][dt]+s?\b' "D:\tmp\PAT_060\PAT*.txt"

Select-String werkt trouwens hoofdletterONgevoelig. Je kan het wel hoofdlettergevoelig maken door -CaseSensitive toe te voegen achter het commando:

Select-String 'Sm[ei][dt]+s?\b' "D:\tmp\PAT_060\PAT*.txt" -CaseSensitive

Dan krijg je in dit geval alleen Smet en varianten, maar geen SMET of smet.

Dit is nog maar het begin van wat er mogelijk is. Je ziet dat reguliere expressies snel ingewikkeld kunnen worden. Maar ze zijn heel krachtig en flexibel.

Kijk verder op de Pagina Tools/Reguliere Expressies

De foto’s uit mijn collectie zijn in principe niet te koop, maar een ernstig bod kan ik altijd in overweging nemen.