Hoofdstuk 2. Wat is een reguliere expressie?

Een reguliere expressie is een manier om condities te specificeren waaraan voldaan dient te worden voor een beoogde situatie. Wanneer u normaal gesproken in een teksteditor zoekt, specificeert u letterlijk de tekst waarnaar gezocht moet worden. Wanneer u daarentegen gebruik maakt van reguliere expressies, geeft u aan hoe een gegeven zoekresultaat eruit dient te zien. Voorbeelden hiervan zijn onder andere ik zoek naar het woord KDE, maar alleen aan het begin van de regel, of ik zoek naar het woord de, maar het moet een losstaand woord zijn, of ik ben opzoek naar bestanden die beginnen met het woord test, gevolgd door een aantal getallen, bijvoorbeeld test12, test107 en test007

U construeert een reguliere expressie op basis van sub-expressies, zoals groot Lego speelgoed van kleinere onderdelen gemaakt worden. Evenals in de Lego-wereld, is er een aantal basisbouwstenen. In het volgende beschrijf ik elk van deze basisbouwstenen aan de hand van een aantal voorbeelden.

Voorbeeld 2.1. Zoeken naar normale tekst.

Als u op zoek bent naar een gegeven tekst, dan is een reguliere expressie zeker geen goede keuze. De reden hiervoor is dat reguliere expressies een speciale betekenis toekennen aan sommige karakters. Hiertoe behoren onder ander de volgende karakters: *|$. Dus als u wilt zoeken naar de tekst kde. (m.a.w. de karakters kde gevolgd door een punt), dan zou u dit als kde\.dienen te specificeren. [1]. Het schrijven van \. in plaats van gewoon . wordt escaping genoemd.


Voorbeeld 2.2. URL's zoeken

Wanneer u iets dat op een URL lijkt selecteert in KDE, dan biedt het programma klipper aan konqueror te starten met de geselecteerde URL.

Klipper doet dit door de selectie te vergelijken met een aantal reguliere expressies, en wanneer één van de reguliere expressies ermee overeenkomt. wordt het bijbehorende commando uitgevoerd.

De reguliere expressie voor URL's zegt (onder andere), dat de selectie moet beginnen met de tekst http://. Dit wordt beschreven met reguliere expressies door http:// voor de tekst te plaatsen met een dakje (het teken ^).

Het bovenstaande is een voorbeeld van posities zoeken met behulp van reguliere expressies. Op overeenkomstige wijze kan naar de positie regeleinde gezocht worden met het teken $ (m.a.w. het dollarteken).


Voorbeeld 2.3. Zoeken naar het woord the, maar niet naar there,breathe of another

Twee extra types positie kunnen op bovenstaande wijze gezocht worden, namelijk de positie op een woordgrens, en de positie op een niet-woordgrens. De posities worden gespecificeerd met de tekst \b (voor woordgrens) en \B (voor niet-woordgrens)

Dus, zoeken naar het woordthe kan gedaan worden met de reguliere expressie \bthe\b. Dit geeft aan dat we zoeken naar the zonder letters aan elke kant ervan (m.a.w. met een woordgrens aan elke kant)

De vier reguliere expressies om op positie te zoeken worden in de reguliere expressie editor toegevoegd met vier verschillende positiehulpmiddelen


Voorbeeld 2.4. Zoeken naar ofwel dit of dat

Stelt u zich voor dat u een document wilt doorzoeken voor ofwel het woord dit of het woord dat. Met een normale zoekmethode kunt u dit in twee zoekacties, de eerste keer, zou u naar dit zoeken, en de tweede maal zou u zoeken naar dat.

Met behulp van reguliere expressies zou u naar beide zoeken in dezelfde zoekactie. Dit doet u door te zoeken naar dit|dat. bijv. door de twee woorden van elkaar te scheiden met een verticale balk.[2]

In de reguliere expressie editor schrijft u de verticale balk niet zelf, maar in plaats daarvan selecteert u hulpmiddel alternatieven, en voegt u sub-reguliere expressies in boven elkaar.


Voorbeeld 2.5. Iets zoeken

Reguliere expressies worden vaak vergeleken met het zoeken met wildcards in de shell - dat is de mogelijkheid een aantal bestanden te specificeren met een asterisk. U kent zoeken met wildcard waarschijnlijk van de volgende voorbeelden:

  • rm *~ - hier is *~ de shell wildcard die overeenkomt met ieder bestand dat eindigt met ~

  • cat test??.res - komt overeen met elk bestand dat begint met test gevolgd door twee willekeurige tekens, gevolgd door extensie .res

In de shell komt de asterisk overeen met een willekeurig teken en een willekeurig aantal malen. Met andere woorden, de asterisk komt overeen met alles. Dit wordt geschreven als .* met de syntaxis voor reguliere expressies.De punt komt overeen met een willekeurig afzonderlijk teken, m.a.w. slechts één teken, en de asterisk zegt dat de regulier expressie die eraan voorafgaat een willekeurig aantal malen gezocht dient te worden. Samen betekent het een willekeurig afzonderlijk teken een willekeurig aantal malen.

Dit ziet er misschien onnodig ingewikkeld uit, maar u zult de kracht ervan zien wanneer u het overzicht van het geheel krijgt . Hier is een andere eenvoudige reguliere expressie: a. De lettera op zichzelf is een reguliere expressie die overeenkomt met een enkele letter, namelijk de letter a. Als u deze combineert met de asterisk, bijv. a*, dan hebben we een reguliere expressie die een willekeurig aantal keren de letter a zoekt.

We kunnen verscheidene reguliere expressies opeenvolgend met elkaar combineren, bijvoorbeeld ba(na)*. [3]Stelt u zich voor dat u deze reguliere expressie in het zoekveld van een teksteditor getypt had, dan had u (onder andere) de volgende woorden gevonden: ba, bana, banana, bananananananana

Gegeven bovenstaande informatie, is het hopelijk niet moeilijk voor u de shell wildcard test??.res als een reguliere expressie te schrijven. Antwoord: test..\.res. De punt alleen is een willekeurig teken. Om alleen een punt te zoeken dient u \. te schrijven.[4]. Met andere woorden, de reguliere expressie \. komt overeen met een punt, terwijl een punt op zichzelf overeenkomt met een willekeurig teken.

In de reguliere expressie editor wordt de herhaalde reguliere expressie gemaakt met het hulpmiddel herhaalde inhoud


Voorbeeld 2.6. Het vervangen van & door & in een HTML-document

In HTML dient het speciale teken & geschreven te worden als & - dit is vergelijkbaar met gebruik van stuurcodes in reguliere expressies.

Stelt u zich voor dat u een HTML-document heeft geschreven in een normale editor (bijvoorbeeld XEmacs of Kate), en u hebt deze regel helemaal vergeten. Wat u zou doen wanneer u zich uw vergissing realiseerde, is elke & vervangen door &.

Dit kunt u eenvoudig doen met het normale zoeken en vervangen, er ligt echter een adder onder het gras. Stelt u zich voor dat u zich deze regel wel een beetje hebt herinnerd - en het op een aantal plaatsen goed gedaan hebt. Onvoorwaardelijk vervangen zou resulteren in dat & vervangen wordt door &

Wat u eigenlijk wilt is dat & alleen vervangen dient te worden als het niet gevolgd wordt door de letters amp;. U kunt dit doen door gebruik te maken van reguliere expressies met positief vooruitkijken.

De reguliere expressie, die alleen overeenkomt met een en-teken als die niet gevolgd wordt door de letters amp; ziet er als volgt uit: &(?!amp;). Dit is natuurlijk eenvoudiger te lezen door de reguliere expressie editor te gebruiken, waar u de hulpmiddelen voor vooruitkijken zou gebruiken.




[1] De editor voor reguliere expressies lost dit probleem voor u op door te zorgen voor de stuurcode regels te zorgen.

[2] Merk op dat aan elke zijde van de verticale balk een reguliere expressie staat, dus deze functie is niet alleen voor het zoeken naar twee verschillende stukken tekst, maar voor het zoeken naar twee verschillende reguliere expressies.

[3] (na)* betekent dat hetgeen zich binnen de haakjes bevindt een willekeurig aantal malen herhaald wordt.

[4] Dit wordt stuurcodes gebruiken genoemd.