Een inleiding tot reguliere expressies

Inleiding

Als systeembeheerders, ontwikkelaars, QA-engineers, ondersteuningsengineers, enzovoort, moet men een bepaald patroon vinden, zoals een reeks IP-adressen behorend tot een bepaald bereik of een reeks tijdstempels of groepen domein- of subdomeinnamen, uit bestanden. Men moet ook een woord vinden dat op een bepaalde manier gespeld is of mogelijke typefouten in een bestand vinden. Hier komen reguliere expressies van pas.

Reguliere expressies zijn sjablonen om patronen te matchen (of soms om patronen niet te matchen). Ze bieden een manier om tekst te beschrijven en te ontleden. Deze tutorial zal inzicht geven in reguliere expressies zonder in te gaan op de bijzonderheden van een bepaalde taal. We zullen gewoon egrep gebruiken om de concepten uit te leggen.

Reguliere Expressies

Reguliere expressies bestaan uit twee soorten karakters:

  • de reguliere letterlijke karakters en

  • de metakarakters

zijn degene die de kracht geven aan de reguliere expressies.

Bekijk het volgende landenbestand country.txt waar de eerste kolom de naam van het land is, de tweede kolom de bevolking van het land is, en de derde kolom het continent is.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

Anker Metakarakters

De eerste groep “metakarakters” die we zullen bespreken zijn ^ en $. ^ en $ komen respectievelijk overeen met het begin en het einde van een patroon en worden anker metakarakters genoemd.

Om de namen te vinden van alle landen waarvan de naam begint met I, gebruiken we de expressie:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

of om alle landen te vinden waarvan de continentnamen eindigen op e, doen we:

$ egrep 'e$' country.txt
Italy,57634327,Europe

Het volgende metakarakter is de punt (.), die overeenkomt met elk één karakter. Om alle regels te matchen waarin de landnaam precies 5 tekens lang is:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

Hoe zit het met het vinden van alle regels waarin de landnaam begint met I of J en de landnaam 5 tekens lang is?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…] wordt een karakterset of een karakterklasse genoemd. Binnen een karakterset wordt slechts één van de opgegeven tekens gematcht.

Een ^ binnen de karakterset maakt de karakterset ongedaan. Het volgende voorbeeld zal landnamen matchen die vijf tekens lang zijn maar niet beginnen met I of J.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

De Groeperingsmetakarakter en de Alternatie

Om alle regels te matchen die Azië of Afrika bevatten:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Dit kan ook worden gedaan door A en a gemeenschappelijk te nemen.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

Kwantificeerders

In plaats van het schrijven van

$ egrep '^[IJ]....,' country.txt

kunnen we schrijven

$ egrep '^[IJ].{4},' country.txt

waar {} worden genoemd als de kwantificeerders. Ze bepalen hoe vaak het karakter ervoor moet voorkomen.

We kunnen ook een bereik opgeven:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

Dit zal landnamen matchen die beginnen met I of J en die 4 tot 6 tekens erna hebben.

Er zijn enkele snelkoppelingen beschikbaar voor de kwantificeerders. Bijvoorbeeld,

{0,1} is equivalent aan ?

$ egrep '^ab{0,1}c$' filename

is hetzelfde als

$ egrep '^ab?c' filename

{0,} is equivalent aan *

$ egrep '^ab{0,}c$' filename

is hetzelfde als

$ egrep '^ab*c' filename

{1,} is equivalent aan +

$ egrep '^ab{1,}c$' filename

is hetzelfde als

$ egrep '^ab+c' filename

Laten we eens kijken naar enkele voorbeelden met de expressies die we tot nu toe hebben gezien. Hier zoeken we niet in een bestand, maar in de standaardinvoer. De truc die we gebruiken is dat we weten dat grep (of egrep) zoekt naar een patroon, en als een patroon wordt gevonden, dan wordt de hele regel met het patroon getoond.

We willen alle mogelijke manieren vinden om de zin the grey colour suit was his favourite te spellen.

De uitdrukking zou zijn:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

Kijkend naar de bovenstaande uitdrukking, kunnen we zien dat:

  • grijs kan worden gespeld als grijs of gray

  • kleur kan worden geschreven als kleur of color, dat betekent dat u optioneel is, dus gebruiken we u?

  • evenzo kan favoriet of favoriet worden geschreven als favou?rite

Hoe zit het met het matchen van een Amerikaanse postcode?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

Nog een voorbeeld van het matchen van alle geldige tijden in een 24-uursklok.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

In het bovenstaande voorbeeld zeiden we dat, als het eerste cijfer van het uur 0 of 1 is, dan zal het tweede cijfer elk van 0 tot 9 zijn. Maar als het eerste cijfer 2 is, dan zijn de toegestane waarden voor het tweede cijfer 0,1, 2 of 3.

Woordgrens

Om een patroon te schrijven om woorden te matchen die eindigen op kleur, zodat unicolor, watercolor, multicolor, enz. worden gematcht maar niet kleurloos of kleurrijk. Probeer deze voorbeelden zelf om ermee vertrouwd te raken:

$ egrep 'color\>'

Vervolgens om kleurloos en kleurrijk te matchen, maar niet unicolor, watercolor, multicolor, enz.

$ egrep '\<color'

Om het exacte woord kleur te matchen, doen we:

$ egrep '\<color\>'

Terugverwijzingen

Stel dat we alle woorden willen vinden die dubbel zijn getypt, zoals de de of voor voor, dan moeten we terugverwijzingen gebruiken. Terugverwijzingen worden gebruikt om patronen te onthouden.

Hier is een voorbeeld:

$ egrep "\<the\> \1"

Of op de generieke manier:

$ egrep "\<(.*)\> \1"

Het bovenstaande voorbeeld kan worden gebruikt om alle namen te vinden waarin de voornaam en de achternaam hetzelfde zijn. Als er meer dan één set haakjes is, dan kan de tweede, derde, vierde, enzovoort worden aangeroepen met \2, \3, \4, enzovoort.

Dit is slechts een inleiding tot de kracht van reguliere expressies.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions