Regular Expressions
Karakter klassen
Zoeken…
Opmerkingen
Eenvoudige lessen
regex | Wedstrijden |
---|---|
[abc] | Een van de volgende tekens: a , b of c |
[az] | Elk teken van a tot z , inclusief (dit wordt een bereik genoemd ) |
[0-9] | Elk cijfer van 0 om te 9 , inclusief |
Gemeenschappelijke klassen
Sommige groepen / reeksen tekens worden zo vaak gebruikt, ze hebben speciale afkortingen:
regex | Wedstrijden |
---|---|
\w | Alfanumerieke tekens plus het onderstrepingsteken (ook wel "woordtekens" genoemd) |
\W | Niet-woordtekens (hetzelfde als [^\w] ) |
\d | Cijfers ( breder dan [0-9] sinds Perzische cijfers, Indiase cijfers enz.) |
\D | Niet-cijfers ( korter dan [^0-9] sinds Perzische cijfers, Indiase cijfers weigeren) |
\s | Witruimte-tekens (spaties, tabbladen, enz ...) Opmerking : kan variëren afhankelijk van uw engine / context |
\S | Niet-witruimte tekens |
Klassen ontkennen
Een caret (^) na de vierkante haakje opent als een ontkenning van de tekens die erop volgen. Dit komt overeen met alle tekens die niet in de tekenklasse vallen.
Niet-overeenkomende tekenklassen komen ook overeen met regeleindetekens. Als deze niet overeenkomen, moeten de specifieke regeleindetekens aan de klasse worden toegevoegd (\ r en / of \ n).
regex | Wedstrijden |
---|---|
[^AB] | Elk ander teken dan A en B |
[^\d] | Elk teken, behalve cijfers |
De basis
Stel dat we een lijst met teams hebben met de volgende naam: Team A
, Team B
, ..., Team Z
Vervolgens:
-
Team [AB]
: dit komt overeen metTeam A
ofTeam B
-
Team [^AB]
: dit komt overeen met elk team behalveTeam A
ofTeam B
We moeten vaak tekens die bij elkaar horen in een of andere context (zoals letters van A
tot Z
) bij elkaar zoeken, en dit is waar karakterklassen voor zijn.
Match verschillende, vergelijkbare woorden
Overweeg de karakterklasse [aeiou]
. Deze tekenklasse kan in een reguliere expressie worden gebruikt om overeen te komen met een set van gelijk gespelde woorden.
b[aeiou]t
overeen met:
- knuppel
- inzet
- beetje
- bot
- maar
Het komt niet overeen:
- aanval
- BTT
- bt
Karakterklassen op hun eigen match een en slechts een karakter tegelijk.
Overeenkomen met niet-alfanumerieke tekens (ontkende tekenklasse)
[^0-9a-zA-Z]
Dit komt overeen met alle tekens die geen cijfers of letters zijn (alfanumerieke tekens). Als het onderstrepingsteken _
ook moet worden genegeerd, kan de uitdrukking worden ingekort tot:
[^\w]
Of:
\W
In de volgende zinnen:
Hoi, hoe is het?
Ik kan niet wachten op 2017 !!!
De volgende tekens komen overeen:
,
,,
'
,?
en het einde van de regel.
'
,
!
en het einde van de regel.
UNICODE OPMERKING
Merk op dat sommige smaken met ondersteuning voor Unicode-karaktereigenschappen \w
en \W
kunnen interpreteren als [\p{L}\p{N}_]
en [^\p{L}\p{N}_]
wat andere Unicode-letters betekent en numerieke tekens worden ook opgenomen (zie PCRE-documenten ). Hier is een PCRE \w
test :
In .NET, \w
= [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}\p{Mn}\p{Nd}\p{Pc}]
, en merk op dat het niet overeenkomt met \p{Nl}
en \p{No}
tegenstelling tot PCRE (zie de \w
.NET-documentatie ):
Merk op dat om een of andere reden kleine letters van Unicode 3.1 (zoals 𝐚𝒇𝓌𝔨𝕨𝗐𝛌𝛚
) niet overeenkomen.
Java's (?U)\w
komen overeen met een mix van wat \w
overeenkomt met PCRE en .NET:
Overeenkomen met niet-cijfers (ontkende tekenklasse)
[^0-9]
Dit komt overeen met alle tekens die geen ASCII-cijfers zijn.
Als Unicode-cijfers ook moeten worden genegeerd, kan de volgende uitdrukking worden gebruikt, afhankelijk van uw smaak- / taalinstellingen:
[^\d]
Dit kan worden ingekort tot:
\D
Mogelijk moet u ondersteuning voor Unicode-tekeneigenschappen expliciet inschakelen door de u
modifier of programmatisch in sommige talen te gebruiken, maar dit is niet vanzelfsprekend. Om de intentie expliciet over te brengen, kan het volgende construct worden gebruikt (wanneer ondersteuning beschikbaar is):
\P{N}
Wat per definitie betekent: elk teken dat in geen enkel script een numeriek teken is. In een ontkend tekenbereik kunt u het volgende gebruiken:
[^\p{N}]
In de volgende zinnen:
Hoi, hoe is het?
Ik kan niet wachten op 2017 !!!
De volgende karakters komen overeen:
,
,,
'
,?
, het einde van de regel en alle letters (kleine letters en hoofdletters).
'
,
!
, het einde van de regel en alle letters (kleine letters en hoofdletters).
Karakterklasse en veel voorkomende problemen voor beginners
1. Karakterklasse
Karakterklasse wordt aangegeven met []
. Inhoud binnen een tekenklasse wordt single character separately
behandeld als single character separately
. Stel bijvoorbeeld dat we gebruiken
[12345]
In het bovenstaande voorbeeld betekent dit match 1 or 2 or 3 or 4 or 5
. In eenvoudige woorden, het kan worden begrepen als or condition for single characters
( nadruk op één teken )
1.1 Woord van waarschuwing
- In de tekenklasse is er geen concept om een string te matchen. Dus als u regex
[cat]
, betekent dit niet dat het letterlijk overeen moet komen met het woordcat
, maar het betekent dat het moet overeenkomen metc
ofa
oft
. Dit is een veel voorkomend misverstand dat bestaat bij mensen die nieuw zijn in regex. - Soms gebruiken mensen
|
(afwisseling) in de karakterklasse, denkend dat het zal fungeren alsOR condition
die verkeerd is. bijv. het gebruik van[a|b]
betekent eigenlijk matcha
of|
(letterlijk) ofb
.
2. Bereik in karakterklasse
Bereik in tekenklasse wordt aangegeven met -
teken. Stel dat we elk teken binnen de Engelse alfabetten A
tot Z
. Dit kan worden gedaan met behulp van de volgende tekenklasse
[A-Z]
Dit kan worden gedaan voor elk geldig ASCII- of Unicode-bereik. De meest gebruikte bereiken zijn [AZ]
, [az]
of [0-9]
. Bovendien kunnen deze bereiken worden gecombineerd in tekenklasse als
[A-Za-z0-9]
Dit betekent dat elk teken in het bereik A to Z
of a to z
of 0 to 9
. Het bestellen kan van alles zijn. Het bovenstaande is dus gelijk aan [a-zA-Z0-9]
zolang het bereik dat u definieert correct is.
2.1 Woord van waarschuwing
Soms schrijven mensen het bij het schrijven van bereiken voor
A
totZ
als[Az]
. In de meeste gevallen is dit verkeerd omdat wez
plaats vanZ
Dit betekent dus dat elk teken uit ASCII-bereik65
(van A) tot122
(van z) overeenkomt met veel onbedoeld teken na ASCII-bereik90
(van Z). EC[Az]
kan echter worden gebruikt om alle[a-zA-Z]
-letters in regex in POSIX-stijl te matchen wanneer de sortering is ingesteld voor een bepaalde taal.[[ "ABCEDEF[]_abcdef" =~ ([Az]+) ]] && echo "${BASH_REMATCH[1]}"
op Cygwin metLC_COLLATE="en_US.UTF-8"
levertABCEDF
. Als uLC_COLLATE
opC
(op Cygwin, klaar metexport
), geeft dit de verwachteABCEDEF[]_abcdef
.Betekenis van
-
binnen de karakterklasse is speciaal. Het geeft het bereik aan zoals hierboven uitgelegd. Wat als we willen aan te passen-
karakter letterlijk? We kunnen het nergens anders plaatsen, omdat het een bereik aangeeft als het tussen twee tekens wordt geplaatst. In dat geval moeten we-
in het begin van de karakterklasse zoals[-AZ]
of in het einde van de karakterklasse zoals[AZ-]
ofescape it
als je het in het midden wilt gebruiken zoals[AZ\-az]
.
3. Ontkende karakterklasse
Negatieve tekenklasse wordt aangegeven door [^..]
. Het caret-teken ^
duidt op elk willekeurig teken behalve het teken in de tekenklasse. bv
[^cat]
betekent overeenkomen met elk teken behalve c
of a
of t
.
3.1 Woord van waarschuwing
- De betekenis van het caret-teken
^
alleen in aanmerking voor ontkenning als het in de beginklasse staat. Als het ergens anders in de tekenklasse voorkomt, wordt het behandeld als letterlijk caret-teken zonder speciale betekenis. - Sommige mensen schrijven regex zoals
[^]
. In de meeste regex-motoren geeft dit een foutmelding. De reden hiervoor is dat wanneer u^
in de beginpositie gebruikt, dit ten minste één teken verwacht dat moet worden genegeerd. In JavaScript is dit echter een geldig construct dat overeenkomt met alles behalve niets , dat wil zeggen dat het overeenkomt met elk mogelijk symbool (behalve diakritische tekens, althans in ES5).
POSIX-tekenklassen
POSIX-tekenklassen zijn vooraf gedefinieerde reeksen voor een bepaalde reeks tekens.
Karakterklasse | Beschrijving |
---|---|
[:alpha:] | Alfabetische tekens |
[:alnum:] | Alfabetische tekens en cijfers |
[:digit:] | cijfers |
[:xdigit:] | Hexadecimale cijfers |
[:blank:] | Spatie en Tab |
[:cntrl:] | Controle karakters |
[:graph:] | Zichtbare tekens (alles behalve spaties en controletekens) |
[:print:] | Zichtbare tekens en spaties |
[:lower:] | Kleine letters |
[:upper:] | Hoofdletters |
[:punct:] | Interpunctie en symbolen |
[:space:] | Alle witruimtetekens, inclusief regeleinden |
Extra karakterklassen kunnen beschikbaar zijn, afhankelijk van de implementatie en / of locale.
Karakterklasse | Beschrijving |
---|---|
[:<:] | Begin van het woord |
[:>:] | Einde van woord |
[:ascii:] | ASCII-tekens |
[:word:] | Letters, cijfers en onderstrepingstekens. Gelijk aan \w |
Als u de reeks tussen haakjes (ook wel tekenklasse) wilt gebruiken, moet u ook de vierkante haakjes opnemen. Voorbeeld:
[[:alpha:]]
Dit komt overeen met één alfabetisch teken.
[[:digit:]-]{2}
Dit komt overeen met 2 tekens, die cijfers of -
. Het volgende komt overeen:
-
--
-
11
-
-2
-
3-
Meer informatie is beschikbaar op: Regular-expressions.info