Ga aan de slag met Regex: reguliere expressies maken het gemakkelijk

Openbaarmaking: Uw steun helpt de site draaiende te houden! We verdienen een verwijzingsvergoeding voor sommige van de services die we op deze pagina aanbevelen.


Een reguliere expressie, kortweg regex of regexp, is een reeks letters en symbolen die een logisch patroon definieert. Tekenreeksen kunnen vervolgens worden vergeleken met het patroon om tekenreeksen te identificeren die overeenkomen met het logische patroon dat is gedefinieerd door de regex. Op basis van deze vergelijking kan regex worden gebruikt om tekstreeksen te identificeren die voldoen aan specifieke vereisten of om te valideren dat strings voldoen aan een vereist patroon.

Als deze uitleg van regex een beetje abstract lijkt, zal misschien een kijkje nemen naar een paar veel voorkomende toepassingen van regex om hun nut te verduidelijken. Regex wordt de hele tijd gebruikt bij computerprogrammering. Hier zijn bijvoorbeeld enkele veelvoorkomende toepassingen voor regex:

  • Om te valideren dat een e-mailadres dat in een webformulier is ingevoerd, een correct geformuleerd e-mailadres is.
  • Om alle bestanden in een computersysteem te identificeren die eindigen op een bepaalde bestandsextensie.
  • Om de aangevraagde URL’s van een webserver te controleren en omleidingen uit te voeren als de URL’s voldoen aan een regex-patroon.

Het is belangrijk om te begrijpen dat regex een logisch systeem is om patronen te beschrijven en geen taal. Regex is echter geïmplementeerd in veel verschillende programmeertalen en kan ook worden gebruikt voor het zoeken naar tekst in veel teksteditors.

Geschiedenis van Regex

Regex is bedacht als een theoretisch computerwetenschappelijk principe toen het in 1956 werd gemaakt door wiskundige Stephen Cole Kleene. Aanvankelijk was regex puur theoretisch. In 1968 werd het echter voor het eerst gebruikt in een computerapplicatie toen Ken Thompson het opnam in de QED-teksteditor. Thompson was niet de enige in zijn adoptie van regex. Rond dezelfde tijd nam Douglas T Ross regex voor lexicale analyse op in een compiler.

Deze eerste regex-implementaties werden snel gevolgd. Begin jaren zeventig werden logische patronen met regex toegevoegd aan de Unix-teksteditor, ed. Kort daarna werd de in ed ingebouwde regex-parser uitgerold als een stand-alone Unix-hulpprogramma genaamd grep. Op dat moment was het slechts een kwestie van tijd voordat regex-ondersteuning werd opgenomen in veel Unix-hulpprogramma’s en -toepassingen, waaronder vi, lex, sed, Awk, expr, Emacs en meer.

Tegen de tijd dat regex zijn weg naar verschillende hoeken van het Unix-besturingssysteem had gevonden, was het verschanst. Er was echter nog ruimte voor verbetering. Dus de originele regex-syntaxis die door Kleene was ontwikkeld, werd in de jaren tachtig verbeterd toen ondersteuning voor uitgebreide regex-patronen aan Perl werd toegevoegd op basis van een uitgebreide regex-bibliotheek geschreven door Henry Spencer. Maar zelfs na de toevoeging van regex aan Perl bleef Spencer het idee uitbreiden en een latere en geavanceerdere iteratie van zijn bibliotheek werd ingebouwd in de Tcl-programmeertaal – en die implementatie bereikte uiteindelijk zijn weg naar spraakmakende moderne informatiebeheerprojecten zoals PostgreSQL.

Gedurende de jaren tachtig werd regex nooit gestandaardiseerd. Dat veranderde echter in 1992 toen regex werd gestandaardiseerd in POSIX.2. Tegenwoordig wordt regex ondersteund door veel verschillende programmeertalen en teksteditors. De meeste moderne implementaties zijn POSIX-compatibel, maar breiden de POSIX-standaard over het algemeen op verschillende manieren uit, die van implementatie tot implementatie verschillen. Dientengevolge, hoewel basisregexpatronen over het algemeen overeenkomen van de ene implementatie tot de volgende, kunnen geavanceerde patronen aanzienlijk variëren, afhankelijk van de omgeving waarin ze worden toegepast.

Hoe Regex werkt

Een reguliere expressie is een combinatie van twee soorten karakters: letterlijke en speciale karakters. In combinatie definiëren deze tekens een logisch patroon. Tekenreeksen kunnen met dit patroon worden vergeleken om te zien of ze in het patroon passen dat door de uitdrukking is gedefinieerd.

Letterlijke karakters vertegenwoordigen zichzelf. Dat betekent dat een letterlijke letter a staat voor de letter a en een letterlijke letter 1 staat voor het cijfer 1. Regex is echter niet erg waardevol als het beperkt blijft tot letterlijke karakters. Speciale karakters maken regex nuttig.

Speciale karakters hebben een logische betekenis binnen een regex-patroon. Laten we bijvoorbeeld naar de stip kijken. De punt of punt wordt gebruikt om elk teken weer te geven. Dus .a zou overeenkomen met elke reeks van twee tekens waarin het tweede teken de letter a was. Dat betekent dat ba, 1a, -a, aa en de letter a voorafgegaan door een lege ruimte allemaal overeenkomen met dat regex-patroon.

De punt is niet het enige speciale teken in regex. Er zijn ongeveer een dozijn speciale karakters die kunnen worden gecombineerd met letterlijke letters om complexe logische patronen te beschrijven. Laten we twee voorbeelden bekijken van hoe letterlijke tekens en speciale tekens worden gecombineerd om complexe uitdrukkingen te definiëren:

  • Als je er zeker van wilt zijn dat een reeks tekst een e-mailadres is, kun je het testen met dit regex-patroon: ^ [A-Z0-9 ._% + -] [e-mail beveiligd] [A-Z0-9.-] +. [AZ] {2,} $.
  • Om bestandsnamen te scannen en namen te vangen die eindigen op de bestandsextensie .php, kunt u de volgende regex gebruiken: ^. *. Php $.

Als u nog niet bekend bent met regex, zijn die patronen waarschijnlijk behoorlijk verwarrend. Om te begrijpen hoe die patronen werken, moet je begrijpen wat alle speciale karakters betekenen.

Speciale tekens van Regex

Hoewel elke regex-implementatie in sommige opzichten een beetje varieert, behandelen ze deze speciale tekens over het algemeen op dezelfde manier, op enkele uitzonderingen na.

  • : Het backslash-teken wordt gebruikt om andere speciale tekens te ontsnappen. Dus als u aan een ander teken, zoals een punt, wilt ontsnappen zodat het als een letterlijk teken wordt geïnterpreteerd, kunt u dit doen door de punt vooraf te laten gaan met een backslash als volgt: .
  • ^: Een uptick wordt gebruikt om de beginpositie in een string aan te geven. De regex ^ a komt overeen met elke tekenreeks die begint met de letter a.
  • $: Een dollarteken wordt gebruikt om de eindpositie in een string aan te passen. De regex a $ komt overeen met elke tekenreeks die eindigt op de letter a.
  • .: De punt of punt komt overeen met elk ander teken dan een newline (n) -teken. De regex 1.3 zou overeenkomen met elke tekenreeks met een letterlijke, elk teken en een letterlijke drie zoals 123, 1a3 en zelfs 1 3.
  • |: De verticale buis is een keuze-operator en kan worden geïnterpreteerd als een vervanger voor het woord of. Dus de regex a | b kan worden gelezen als “a of b” en komt overeen met de letter a of de letter b.
  • *: Een asterisk wordt gebruikt om het voorgaande teken nul of meer keren te matchen. Dus de regex. * Zou überhaupt met elke string overeenkomen, zolang deze geen nieuwlijnteken bevatte.
  • ?: Het vraagteken komt nul of één keer overeen met het voorgaande teken, maar niet meer. De Regex 123? zou daarom overeenkomen met 12 of 123.
  • +: Een plusteken komt één of meer keren overeen met het voorgaande teken, maar het teken moet minstens één keer voorkomen, in tegenstelling tot het sterretje dat nul of meer keren overeenkomt met het voorgaande teken. Dus de regex a * b + komt overeen met ab en b, maar niet a omdat de b minstens één keer moet verschijnen vanwege het gebruik van het plusteken.
  • […]: haakjes komen overeen met een enkel teken tussen de haakjes. Of er kan een opwaardering worden toegevoegd, zoals deze [^ …], die overeenkomt met elk teken dat niet tussen de haakjes staat. U hoeft speciale tekens tussen haakjes niet te vermijden, ze worden geïnterpreteerd als letterlijke tekens. Haakjes worden vaak gebruikt om tekenreeksen te definiëren. De regex [0-9] komt bijvoorbeeld overeen met elk enkel cijfer en [A-Z] komt overeen met elke hoofdletter in het Engelse alfabet. Ten slotte kunnen haakjes door komma’s gescheiden tekens bevatten. Dus [a, g] zou overeenkomen met een van de letters a en g.
  • {…}: accolades, expliciete kwantoren genoemd, specificeren het aantal keren dat het voorgaande teken moet voorkomen. De regex ab {2} c kan alleen worden gehaald door abbc. Een tweede nummer kan worden toegevoegd om een ​​bereik met acceptabele waarden te creëren. Dus ab {2,3} c komt overeen met ofwel abbc of abbbc en [0-9] {1,2} komt overeen met een of twee cijfers.
  • (…): haakjes worden gebruikt om een ​​subexpressie binnen een grotere expressie te markeren. Dus de regex (abc) * komt overeen met elke string die bestaat uit de letters abc, maar alle drie de letters moeten samen en in die volgorde verschijnen.

Op zichzelf zijn speciale karakters enigszins nuttig. Het is in de combinatie van deze speciale karakters met letterlijke letters dat krachtige patronen kunnen worden beschreven. De lijst met speciale tekens hierboven bevat enkele eenvoudige combinaties van speciale tekens. Laten we de regex nog eens bekijken voor het identificeren van PHP-bestanden om te zien hoe deze karakters samenwerken.

Dit is de regex in kwestie: ^. *. Php $. Laten we het stuk voor stuk bekijken.

  • ^ geeft het begin van de testreeks aan, in dit geval een bestandsnaam.
  • .* werk samen om aan te geven dat de bestandsnaam een ​​onbeperkt aantal tekens mag bevatten, maar geen nieuwe regels.
  • .php begint met een escape-teken dat ervoor zorgt dat de punt wordt geïnterpreteerd als een letterlijke in plaats van een speciaal teken. Vervolgens geven de letterlijke letters php aan dat we na de naam van het bestand willen controleren op de combinatie van een punt en de letters php.
  • $ geeft aan dat de .php-extensie aan het einde van de zoekreeks moet staan ​​om een ​​match te zijn.

Zoals u kunt zien, slaagt deze regex erin om in slechts negen tekens een logisch patroon te creëren dat complexe bestandsnamen kan doorzoeken en de namen kan vinden die eindigen op de bestandsextensie .php.

Unicode en Regex

Een van de problemen die kunnen opduiken bij het omgaan met regex, is hoe om te gaan met talen die tekens gebruiken die geen deel uitmaken van het moderne Engelse alfabet. Unicode is een coderingsstandaard die dit probleem probeert op te lossen door cijfers in numerieke waarden te coderen.

Sommige regex-implementaties ondersteunen het gebruik van Unicode om regex-patronen te bouwen, wat betekent dat er regex-patronen kunnen worden gemaakt waarmee tekenreeksen kunnen worden getest die tekens uit verschillende talen bevatten. Bovendien kunnen Unicode-expressies worden gecombineerd met letterlijke tekens en speciale tekens om complexe regex-patronen te bouwen.

Enkele van de meest voorkomende Unicode-regexpatronen zijn:

  • p {L}: Komt overeen met elke letter in elke taal. Dus p {L} {2,4} komt overeen met elke reeks letters tussen twee en vier tekens lang.
  • p {Z}: Komt overeen met spaties.
  • p {N}: komt overeen met numerieke tekens.
  • p {P}: Komt overeen met leestekens.

Er zijn veel extra Unicode-eigenschappen die u kunt gebruiken bij het bouwen van reguliere expressies, op voorwaarde dat de implementatie waarmee u werkt Unicode-regex ondersteunt. Lees Unicode Regular Expressions op Regular-Expressions.info voor meer informatie.

Middelen

We hebben net genoeg behandeld in deze inleiding om u een basisgevoel te geven over hoe regex werkt en hoe u het kunt gebruiken om specifieke stukjes code en tekst in een teksteditor aan te wijzen of om gegevens in een computerapplicatie te identificeren en valideren. Bekijk voor meer informatie de volgende bronnen met meer geavanceerde informatie dan wat we in deze korte tutorial hebben behandeld:

  • Regular-Expressions.info: een schat aan kennis over regex in de vorm van artikelen en tutorials.
  • Regex Cheatsheet van RegExLib.com: een handige cheatsheet waarmee u alle verschillende speciale tekens recht kunt houden.
  • RegExLib.com: een gratis opslagplaats van reguliere expressies die u kunt kopiëren en aanpassen aan uw behoeften.

Een van de beste manieren om het schrijven van reguliere expressies onder de knie te krijgen, is door ze te schrijven. Met de volgende online tools kunt u precies dat doen, door uw aangepaste regex direct te vergelijken met een blok aangepaste tekst, zodat u kunt achterhalen hoe u reguliere expressies kunt formuleren die werken:

  • RegExr: de slogan zegt het al: “Leer, bouw en test RegEx.”
  • Regex Pal: maak een regex-patroon en test er vervolgens strings tegen om er zeker van te zijn dat het precies doet wat u wilt.
  • Regex 101: niet alle regex-implementaties zijn gelijk gemaakt. Gebruik deze tool om tekenreeksen te testen op basis van een regex-patroon en het gedrag te verfijnen op basis van de programmeertaal waarin u het patroon gaat implementeren. PHP, JavaScript, Python en Erlang worden ondersteund.

Er zijn nogal wat teksten geschreven over regex, maar drie vallen op als de beste van de klas. Als je regex echt onder de knie wilt krijgen, zal een van deze drie teksten je een heel eind op weg helpen:

  • Kookboek voor reguliere expressies: gedetailleerde oplossingen in acht programmeertalen (2012) door Goyvaerts en Levithan
  • Introductie van Regular Expressions (2012) van Michael Fitzgerald
  • Mastering Regular Expressions (2006) door Jeffrey E F Friedl.

Overzicht

Reguliere expressies zijn een taalonafhankelijk hulpmiddel dat door computerprogrammeurs wordt gebruikt om logische patronen op te bouwen. Deze patronen kunnen vervolgens worden gebruikt om tekstreeksen te identificeren die bij het patroon passen. Regex-implementaties zijn er in overvloed en regex wordt ondersteund door de meeste moderne programmeertalen en is beschikbaar binnen de zoekhulpmiddelen die in veel teksteditors zijn ingebouwd. Aan de slag gaan met regex kan lastig zijn, maar het beheersen van regex is een noodzakelijke stap in de ontwikkeling van elke computerprogrammeur.

Verder lezen en bronnen

We hebben meer handleidingen, tutorials en infographics met betrekking tot computers en codering:

  • Bash Programming Resources: ga aan de slag met de belangrijkste Unix-opdrachtregel.
  • Sed Inleiding en bronnen: de stream-editor is een geweldig hulpmiddel voor het gebruiken en leren van reguliere expressies.
  • Awk-bronnen: leer alles over de zustertool Awk van sed.

De ultieme lijst met webmastertools A-Z

Sed en Awk en Bash maken slechts deel uit van een grote verzameling tools waarmee systeembeheerders besturingssystemen kunnen beheren. De Ultieme Lijst van Webmastertools A-Z zal u veel hulp bieden bij het uitvoeren van uw werk.

De ultieme lijst met webmastertools A-Z
De ultieme lijst met webmastertools A-Z

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map