Met regullar expressions 101 kunt u de patronen beschrijven die op elkaar lijken. Bijvoorbeeld, u hebt meerdere <img>tags en u wilt al deze afbeeldingen naar de imagesmap verplaatsen:
<img src="9.png"> → <img src="afbeeldingen/9.png">
<img src="10.png"> → <img src="afbeeldingen/10.png">
en zo verder
U kunt eenvoudig een reguliere expressie schrijven die overeenkomt met alle bestandsnamen die uit getallen bestaan en vervolgens al deze tags in één keer vervangen.
Basis syntaxis
Als u een van de alternatieven moet matchen , gebruikt u een afwisseling (verticale balk). Bijvoorbeeld:
Reguliere expressie Betekenis
a|img|h1|h2 ofwel, aof img, of h1, ofh2
Bij het gebruik van afwisseling moet u vaak tekens groeperen ; u kunt dit doen met haakjes. Als u bijvoorbeeld een HTML-tag wilt matchen, werkt deze aanpak niet:
Reguliere expressie Betekenis
<h1|h2|b|i> <h1of h2(zonder de hoekige haken) of bofi>
omdat <geldt alleen voor het eerste alternatief en >geldt alleen voor het laatste. Om de hoekige haakjes op alle alternatieven toe te passen, moet u de alternatieven groeperen:
<(h1|h2|b|i)>
De laatste primitieve (ster) laat je alles nul of meer keer herhalen . Je kunt het op één teken toepassen, bijvoorbeeld:
Reguliere expressie Betekenis
a* een lege string, a, aa, aaa, aaaa, etc.
U kunt het ook toepassen op meerdere tekens tussen haakjes:
Reguliere expressie Betekenis
(ab)* een lege string, ab, abab, ababab, abababab, etc.
Houd er rekening mee dat als u de haakjes verwijdert, de ster alleen op het laatste teken wordt toegepast:
Reguliere expressie Betekenis
ab* een lege string, ab, abb, abbb, abbbb, etc.
Een portret van Stephen Cole Kleene, de uitvinder van de reguliere expressie
Stephen Kleene (1909-1994), de uitvinder van reguliere expressies.
Auteur: Konrad Jacobs. Bron: Archief van het Mathematisches Forschungsinstitut Oberwolfach.
De ster is vernoemd naar de Amerikaanse wiskundige Stephen Kleene , die in de jaren 50 reguliere expressies uitvond. Deze kan een lege string matchen, maar ook een willekeurig aantal herhalingen.
Deze drie primitieven (alternatie, haakjes en de ster voor herhaling) zijn voldoende om elke reguliere expressie te schrijven, maar de syntaxis kan omslachtig zijn. U kunt nu bijvoorbeeld een regex schrijven voor het matchen van bestandsnamen die getallen zijn in een <img>tag:
Reguliere expressie Betekenis
(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* een of meer cijfers
(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* een positief geheel getal (nul mag niet als eerste teken worden gebruikt)
De haakjes kunnen onbeperkt worden genest, bijvoorbeeld:
Reguliere expressie Betekenis
(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(,(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)* een of meer positieve gehele getallen, gescheiden door komma's
Handige snelkoppelingen voor karakterklassen
Je kunt elke regex schrijven met de drie primitieven, maar het wordt snel moeilijk om te lezen, dus er zijn een paar snelkoppelingen uitgevonden. Wanneer je een van de genoemde tekens moet matchen , zet ze dan tussen vierkante haken:
Reguliere expressie Kortere regex Betekenis
a|e|i|o|u|y [aeiouy] een klinker
0|1|2|3|4|5|6|7|8|9 [0123456789] een cijfer
0|1|2|3|4|5|6|7|8|9 [0-9] een cijfer
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z [a-z] een brief
Zoals u kunt zien, is het mogelijk om alleen het eerste en het laatste toegestane teken te specificeren als u er een streepje tussen plaatst. Er kunnen meerdere van dergelijke bereiken tussen vierkante haken staan:
Reguliere expressie Betekenis
[a-z0-9] een letter of een cijfer
[a-z0-9_] een letter, een cijfer of het onderstrepingsteken
[a-f0-9] een hexadecimaal cijfer
Er zijn een aantal vooraf gedefinieerde tekenklassen die nog korter zijn om te schrijven:
Reguliere expressie Betekenis
\s een spatieteken: de spatie, het tabteken, de nieuwe regel of de wageninvoer
\d een cijfer
\w een woordteken (een letter, een cijfer of het onderstrepingsteken)
. elk karakter
In Aba Search and Replace bevatten deze tekenklassen Unicode-tekens zoals geaccentueerde letters of Unicode-regeleinden. In andere regex-dialecten bevatten ze meestal alleen ASCII-tekens, dus \dis meestal hetzelfde als [0-9]en \wis hetzelfde als [a-zA-Z0-9_].
De character classes voegen geen nieuwe mogelijkheden toe aan de reguliere expressies; u kunt gewoon alle toegestane tekens met een afwisseling opsommen, maar een character class is veel korter om te schrijven. We kunnen nu een kortere versie van de eerder genoemde regex schrijven:
Reguliere expressie Betekenis
[1-9][0-9]*(,[1-9][0-9])* een of meer positieve gehele getallen, gescheiden door komma's
Herhalingen
Een Kleene-ster betekent "nul of meer keer herhalen", maar vaak heb je nog een aantal herhalingen nodig. Zoals eerder getoond, kun je een regex gewoon kopiëren en plakken om het twee of drie keer te herhalen, maar daar is een kortere notatie voor:
Reguliere expressie Kortere regex Betekenis
\d\d* \d+ een of meer cijfers
(0|1)(0|1)* [01]+ elk binair getal (bestaande uit nullen en enen)
(\s|) \s? ofwel een spatie of niets
http(s|) https? httpofwel ofhttps
(-|\+|) [-+]? het minteken, het plusteken of niets
[a-z][a-z] [a-z]{2} twee kleine letters
[a-z][a-z]((([a-z]|)[a-z]|)[a-z]|) [a-z]{2,5} van twee tot vijf kleine letters
[a-z][a-z][a-z]* [a-z]{2,} twee of meer kleine letters
Er zijn dus de volgende herhalingsoperatoren:
een Kleene-ster *betekent dat deze nul of meer keer herhaald wordt, en kan dus nooit overeenkomen, maar kan één keer, twee keer, drie keer, etc. overeenkomen;
een plusteken +betekent dat het een of meerdere keren herhaald wordt, dus het moet minstens één keer overeenkomen;
een optioneel onderdeel ?betekent nul keer of één keer ;
accolades {m,n}betekent herhalen van m tot n keer .
Merk op dat u elke herhaling kunt uitdrukken met de accolades, zodat deze operatoren elkaar gedeeltelijk dupliceren. Bijvoorbeeld:
Reguliere expressie Kortere regex Betekenis
\d{0,} \d* niets of een paar cijfers
\d{1,} \d+ een of meer cijfers
\s{0,1} \s? ofwel een spatie of niets
Net als de Kleene-ster kunnen de andere herhalingsoperatoren worden toegepast op haakjes, zodat u ze onbeperkt kunt nesten.
Ontsnappen
Als u een van de speciale tekens zoals haakjes, verticale balk, plus of ster moet matchen , moet u ze escapen door er een backslash \voor te plaatsen. Om bijvoorbeeld een getal tussen haakjes te vinden, gebruikt u \(\d+\).
Een veelgemaakte fout is om een backslash voor een punt te vergeten. Let op: een punt betekent elk teken, dus als u example.comin een reguliere expressie schrijft, zal het matchen examplexcomof iets dergelijks, wat zelfs een beveiligingsprobleem in uw programma kan veroorzaken. Nu kunnen we een regex schrijven om de <img>tags te matchen:
<img src="\d+\.png">
Dit komt overeen met alle bestandsnamen die uit cijfers bestaan en we hebben de punt correct geëscaped.
Andere kenmerken
Moderne regex engines voegen meer features toe, zoals backreferences of conditionele subpatronen. Wiskundig gezien behoren deze features niet tot de reguliere expressies; ze beschrijven een niet-reguliere taal, dus je kunt ze niet vervangen door de drie primitieven.
WW: Softtrack
Log in om te downloaden