Patronen

Patronen bestaan uit letterlijke tekenreeksen en tekenklassen. Patronen mogen subpatronen bevatten, die patronen zijn tussen haakjes.

Escape-tekens

In patronen evenals in tekenklassen hebben sommige tekens een speciale betekenis. Om zulke tekens letterlijk overeen te laten komen met deze tekens, moeten ze zo gemarkeerd worden of escaped om de software voor reguliere expressies te laten weten dat het zulke tekens letterlijk moet interpreteren.

Dit wordt gedaan door het teken vooraf te laten gaan door een backslash (\).

De software voor reguliere expressies zal stilletjes een teken met een escape-teken ervoor negeren die geen speciale betekenis heeft in de context, dus, bijvoorbeeld, een j met een escape ervoor (\j) is veilig. Als u er niet zeker van bent of een teken een speciale betekenis heeft, dan kunt u er veilig een escape-teken voor zetten.

Met het escape-teken werken omvat natuurlijk ook het teken backslash zelf, om letterlijk dat teken weer te geven, moet u schrijven \\.

Tekenklassen en afkortingen

Een tekenklasse is een uitdrukking die overeenkomt met een gedefinieerde set tekens. In Reguliere Expressies, worden tekenklassen gedefinieerd door de toegestane tekens voor de klasse tussen rechte haken te zetten, [], of door een van de hieronder beschreven afgekorte klassen te gebruiken.

Eenvoudige tekenklassen bevatten letterlijk een of meer tekens, bijvoorbeeld [abc] (komt overeen met een van de letters a, b of c) of [0123456789] (komt overeen met een cijfer).

Omdat letters en cijfers een logische volgorde hebben, kunt u deze afbreken door er reeksen van te specificeren: [a-c] is gelijk aan [abc] en [0-9] is gelijk aan [0123456789]. Combineren van deze constructies, bijvoorbeeld [a-fynot1-38] is geheel toegestaan (de laatste zou natuurlijk overeenkomen met ofwel a,b,c,d, e,f,y,n,o,t,1,2,3 of 8).

Omdat hoofdletters andere tekens zijn dan hun kleine letter equivalenten, is het nodig om overeenkomsten zonder onderscheid van hoofd- en kleine letters te maken tussen a of b, moet u het schrijven als [aAbB].

Het is natuurlijk mogelijk om een negatieve klasse overeenkomst te maken zoals alles behalve. Er moet dan een dakje (^) aan het begin van de klasse staan:

[^abc] komt overeen met elk teken behalve a, b of c.

Naast letterlijke tekens, zijn er ook enige afkortingen gedefinieerd, om het leven een beetje gemakkelijker te maken:

\a

Dit komt overeen met het ASCII bel-teken (BEL, 0x07).

\f

Dit komt overeen met het ASCII formfeed-teken (FF, 0x0C).

\n

Dit komt overeen met het ASCII linefeed-teken (LF, 0x0A, Unix nieuwe-regel).

\r

Dit komt overeen met het ASCII carriage-return-teken (CR, 0x0D).

\t

Dit komt overeen met het ASCII horizontale tab-teken (HT, 0x09).

\v

Dit komt overeen met het ASCII verticale tab-teken (VT, 0x0B).

\xhhhh

Dit komt overeen met het Unicode-teken overeenkomend met het hexadecimale getal hhhh (tussen 0x0000 en 0xFFFF). \0ooo (bijv., \zero ooo) komt overeen met het ASCII/Latin-1 teken overeenkomend met het octale getal ooo (tussen 0 en 0377).

. (punt)

Dit komt overeen met elk teken (inclusief nieuwe-regel).

\d

Dit komt overeen met een cijfer. Gelijk aan [0-9]

\D

Dit komt overeen met een niet-cijfer. Gelijk aan [^0-9] of [^\d]

\s

Dit komt overeen met een witruimte-teken. Praktisch gelijk aan [ \t\n\r]

\S

Dit komt overeen met een niet-witruimte-teken. Praktisch gelijk aan [^ \t\r\n] en gelijk aan [^\s]

\w

Komt overeen met elk woordteken - in dit geval elke letter, elk cijfer of underscore. Gelijk aan [a-zA-Z0-9_]

\W

Dit komt overeen met een niet-woord-teken - alles behalve letters, cijfers of underscore. Gelijk aan [^a-zA-Z0-9_] of [^\w]

De POSIX-notatie van klassen, [:<class name>:] wordt ook ondersteund. Bijvoorbeeld, [:digit:] is equivalent met \d en [:space:] met \s. Zie de volledige lijst met POSIX-tekenklassen hier.

De afgekorte klassen kunnen in een zelf gemaakte klasse worden gezet, bijvoorbeeld om overeen te komen met een woord-teken, een spatie of een punt, u kunt dan schrijven [\w \.]

Tekens met een speciale betekenis in tekenklassen

De volgende tekens hebben een speciale betekenis binnen de constructie [] van de tekenklasse en er moet een escape-teken voor om letterlijk ingevoegd te worden in een klasse:

]

Beëindigt de tekenklasse. Moet een escape-teken voor tenzij het het allereerste teken in de klasse is (mag na een dakje zonder escape-teken).

^ (dakje)

Geeft een negatieve klasse aan als het het eerste teken is. Moet een escape-teken voor om letterlijk overeen te komen als het het eerste teken in de klasse is.

- (streepje)

Geeft een logische reeks aan. Moet altijd een escape-teken voor binnen een tekenklasse.

\ (backslash)

Het escape-teken. Moet altijd een escape-teken voor.

Alternatieven: overeenkomen met één van

Als u met een set van alternatieve patronen overeen wilt komen, dan kunt u die scheiden door | (teken verticale streep).

Om bijvoorbeeld ofwel Jan of Harry te zoeken, zou u een expressie Jan|Harry moeten gebruiken.

Subpatronen

Subpatronen zijn patronen omgeven door haakjes, ze kunnen op verschillende manieren in de wereld van de reguliere expressies worden gebruikt.

Alternatieven specificeren

U kunt een subpatroon gebruiken om een set alternatieven in een groter patroon te groeperen. De alternatieven zijn gescheiden door het teken | (verticale streep).

Om de woorden int, float of double te laten overeenkomen, kunt u het patroon int|float|double gebruiken. Als u het alleen wilt vinden wanneer het gevolgd wordt door enige witruimte en dan enige letters, stop de alternatieven dan in een subpatroon: (int|float|double)\s+\w+.

Overeenkomende tekst vangen (achterwaartse verwijzingen)

Als u een achterwaartse referentie wilt gebruiken, gebruik dan een subpatroon (PATTERN) om het gewenste deel van het patroon te onthouden. Om te verhinderen het subpatroon te onthouden, gebruik een non-capturing groep (?:PATTERN).

U wilt bijvoorbeeld twee exemplaren van hetzelfde woord gescheiden door een komma en mogelijk enige witruimte, dan kunt u schrijven (\w+),\s*\1. Het subpatroon \w+ zou een groep tekens in een woord vinden en de gehele expressie zou overeenkomen als die gevolgd worden door een komma, 0 of meer witruimtes en dan een gelijke groep woordtekens. (De tekenreeks \1 refereert naar het eerste subpatroon ingesloten in haakjes).

Opmerking

Om meerduidigheid met het gebruik van \1 met enige cijfers erachter (bijv. \12 kan het 12de subpatroon zijn of gewoon het eerste subpatroon met 2) we gebruiken \{12} als syntaxis voor subpatronen met meerdere cijfers.

Voorbeelden:

  • \{12}1 is gebruik subpatroon 12

  • \123 is gebruik gevangen 1 daarna 23 als de normale tekst

Vooruitblik-toekenningen

Een vooruitblik-toekenning is een subpatroon die begint met ofwel ?= of ?!.

Om bijvoorbeeld een overeenkomst te vinden met de letterlijke tekenreeks Bill maar alleen als deze niet wordt gevolgd door Gates, dan kunt u deze expressie gebruiken: Bill(?! Gates). (Dit vindt Bill Clinton evenals Billy the kid, maar negeert stilletjes de andere overeenkomsten.)

Subpatronen voor toekenningen worden niet gevangen.

Zie ook Toekenningen.

Achteruitblik-toekenningen

Een achteruitblik-toekenning is een subpatroon dat begint met ofwel ?<= of ?<!.

Achteruitblik heeft hetzelfde effect als de vooruitblik, maar werkt achterwaarts. Om de letterlijke tekenreeks fruit overeen te laten komen maar alleen indien niet vooraf gegaan door grape, dan kunt u deze expressie gebruiken: (?<!grape)fruit.

Subpatronen voor toekenningen worden niet gevangen.

Zie ook Toekenningen

Tekens met een speciale betekenis in patronen

De volgende tekens hebben een speciale betekenis binnen een patroon en er moet een escape-teken voor om letterlijk met ze overeen te komen:

\ (backslash)

Het escape-teken.

^ (dakje)

Kent het begin van de tekenreeks toe.

$

Kent het einde van de tekenreeks toe.

() (linker en rechter haakje)

Geeft subpatronen aan.

{} (linker en rechter accolade)

Geeft numerieke aantallen aan.

[] (linker en rechter rechte haakje)

Geeft tekenklassen aan.

| (verticale streep)

logische OR. Scheidt alternatieven.

+ (plusteken)

Aantal, 1 of meer.

* (sterretje)

Aantal, 0 of meer.

? (vraagteken)

Een optioneel teken. Kan geïnterpreteerd worden als een aantal, 0 of 1.