Regular Expressions
Regex-modificaties (vlaggen)
Zoeken…
Invoering
Reguliere expressiepatronen worden vaak gebruikt met modificatoren (ook wel vlaggen genoemd ) die regexgedrag opnieuw definiëren. Regex-modificatoren kunnen regelmatig zijn (bijvoorbeeld /abc/i
) en inline (of ingebed ) (bijvoorbeeld (?i)abc
). De meest voorkomende modificaties zijn globale, hoofdlettergevoelige, multiline en dotall modificaties. Regex-smaken verschillen echter in het aantal ondersteunde regex-modificaties en hun typen.
Opmerkingen
PCRE-modificaties
wijziger | In lijn | Beschrijving |
---|---|---|
PCRE_CASELESS | (?ik) | Hoofdletterongevoelige wedstrijd |
PCRE_MULTILINE | (? M) | Meerdere lijnen matchen |
PCRE_DOTALL | (? S) | . komt overeen met nieuwe regels |
PCRE_ANCHORED | (?EEN) | Metateken ^ komt alleen overeen aan het begin |
PCRE_EXTENDED | (?X) | Witruimten worden genegeerd |
PCRE_DOLLAR_ENDONLY | n / a | Metateken $ komt alleen aan het einde overeen |
PCRE_EXTRA | (?X) | Strikte escape parsing |
PCRE_UTF8 | Verwerkt UTF-8 tekens | |
PCRE_UTF16 | Verwerkt UTF-16 tekens | |
PCRE_UTF32 | Verwerkt UTF-32 tekens | |
PCRE_UNGREEDY | (? U) | Zet de motor op lui matchen |
PCRE_NO_AUTO_CAPTURE | (? :) | Schakelt automatisch vastleggen van groepen uit |
Java-modificaties
Modifier ( Pattern.### ) | Waarde | Beschrijving |
---|---|---|
UNIX_LINES | 1 | Schakelt de Unix-lijnenmodus in. |
CASE_INSENSITIVE | 2 | Schakelt hoofdletterongevoelige overeenkomsten in. |
OPMERKINGEN | 4 | Staat witruimte en opmerkingen in een patroon toe. |
MULTILINE | 8 | Schakelt de multilijnmodus in. |
LETTERLIJKE | 16 | Maakt letterlijk parseren van het patroon mogelijk. |
dotall | 32 | Schakelt dotall-modus in. |
UNICODE_CASE | 64 | Maakt Unicode-bewust case-vouwen mogelijk. |
CANON_EQ | 128 | Maakt canonieke gelijkwaardigheid mogelijk. |
UNICODE_CHARACTER_CLASS | 256 | Schakelt de Unicode-versie van vooraf gedefinieerde tekenklassen en POSIX-tekenklassen in. |
DOTALL modifier
Een regexpatroon waarbij een DOTALL-modificator (in de meeste regex-smaken uitgedrukt met s
) het gedrag van verandert .
waardoor het overeenkomt met een newline (LF) symbool:
/cat (.*?) dog/s
Deze regex in Perl-stijl komt overeen met een string als "cat fled from\na dog"
gevangen "fled from\na"
in groep 1.
Een inline-versie: (?s)
(bijv. (?s)cat (.*?) dog
)
Opmerking : In Ruby is het equivalent van de DOTALL-modificatie m
, Regexp::MULTILINE
modificator (bijvoorbeeld /a.*b/m
).
Opmerking : JavaScript biedt geen DOTALL-modifier, dus een .
mag nooit overeenkomen met een nieuweteken. Om hetzelfde effect te bereiken, is een oplossing nodig, bijvoorbeeld het vervangen van alle .
s met een allesomvattende karakterklasse zoals [\S\s]
, of een niet-niets karakterklasse [^]
(deze constructie wordt echter door alle andere motoren als een fout behandeld en is dus niet draagbaar).
MULTILINE modifier
Een ander voorbeeld is een MULTILINE-modifier (meestal uitgedrukt met de vlag m
(niet in Oniguruma (bijv. Ruby) die m
gebruikt om een DOTALL-modifier aan te duiden)) waardoor ^
en $
ankers overeenkomen met het begin / einde van een regel , niet het begin / einde van de hele string.
/^My Line \d+$/gm
vindt alle regels die beginnen met My Line
en bevatten vervolgens een spatie en 1+ cijfers tot aan het regeleinde.
Een inline-versie: (?m)
(bijv. (?m)^My Line \d+$
)
Opmerking: In Oniguruma (bv Ruby) en ook vrijwel alle tekstverwerkers ondersteunen regexps de ^
en $
ankers duiden regel start / eindstanden standaard. U moet \A
gebruiken om het hele document / tekenreeksstart te definiëren en \z
om het document / tekenreekseinde aan te duiden. Het verschil tussen de \Z
en \z
is dat de eerste kan matchen voor het laatste newline (LF) symbool aan het einde van de string (bijv. /\Astring\Z/
vindt een match in "string\n"
) (behalve Python, waarbij \Z
gedrag gelijk is aan \z
en \z
anker niet wordt ondersteund).
IGNORE CASE modifier
De algemene modificator om een case te negeren is i
:
/fog/i
komt overeen met Fog
, foG
, etc.
De inline-versie van de modifier ziet eruit als (?i)
.
Opmerkingen:
In Java wordt in hoofdletterongevoelige overeenkomsten standaard verondersteld dat alleen tekens in het US-ASCII-tekenset worden vergeleken. Unicode-bewust hoofdletterongevoelig matchen kan worden ingeschakeld door de vlag UNICODE_CASE
op te geven in combinatie met deze vlag ( CASE_INSENSITIVE
) . (bijv. Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
). Meer hierover is te vinden op Case-Insensitive Matching in Java RegEx . Ook kan UNICODE_CHARACTER_CLASS
worden gebruikt om overeenkomende Unicode bewust te maken.
VERBOSE / COMMENT / IgnorePatternWhitespace modifier
De modifier die het mogelijk maakt om in sommige delen van het patroon witruimte te gebruiken om het op te maken voor een betere leesbaarheid en om opmerkingen toe te staan die beginnen met #
:
/(?x)^ # start of string
(?=\D*\d) # the string should contain at least 1 digit
(?!\d+$) # the string cannot consist of digits only
\# # the string starts with a hash symbol
[a-zA-Z0-9]+ # the string should have 1 or more alphanumeric symbols
$ # end of string
/
Voorbeeld van een string: #word1here
. Merk op dat het #
-symbool ontsnapt is om een letterlijk #
aan te geven dat deel uitmaakt van een patroon.
Niet-gevormde witte ruimte in het reguliere expressiepatroon wordt genegeerd. Ontsnap eraan om er een deel van te maken.
Gewoonlijk wordt de witruimte in tekenklassen ( [...]
) behandeld als een letterlijke witruimte, behalve in Java.
Het is ook vermeldenswaard dat in PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost regex-smaken opmerkingen (?#:...)
in het regex-patroon kunnen worden gebruikt.
Modifier voor expliciete opname
Dit is een .NET regex-specifieke modifier uitgedrukt met n
. Wanneer gebruikt, worden niet-benoemde groepen (zoals (\d+)
) niet vastgelegd. Alleen geldige vastleggingen hebben expliciet benoemde groepen (bijv. (?<name> subexpression)
).
(?n)(\d+)-(\w+)-(?<id>\w+)
komt overeen met de hele 123-1_abc-00098
, maar (\d+)
en (\w+)
maken geen groepen in het resulterende 123-1_abc-00098
. De enige groep is ${id}
. Zie demo .
UNICODE-modificator
De modificator UNICODE, meestal uitgedrukt als u
(PHP, Python) of U
(Java), zorgt ervoor dat de regex-engine het patroon en de invoertekenreeks behandelt als Unicode-tekenreeksen en patronen, waardoor het patroon steno-klassen maakt zoals \w
, \d
, \s
, etc. Unicode-bewust.
/\A\p{L}+\z/u
is een PHP-regex die overeenkomt met tekenreeksen die bestaan uit 1 of meer Unicode-letters. Bekijk de regex-demo .
Merk op dat in / PHP de modificator /u
de PCRE-engine in staat stelt om strings als UTF8-strings te behandelen (door PCRE_UTF8
werkwoord in te PCRE_UTF8
) en de verkorte PCRE_UTF8
in het patroon Unicode bewust te maken (door PCRE_UCP
werkwoord in te schakelen , zie meer op pcre.org ) .
Patroon- en onderwerpstrings worden behandeld als UTF-8. Deze modifier is beschikbaar vanaf PHP 4.1.0 of hoger op Unix en vanaf PHP 4.2.3 op win32. UTF-8-geldigheid van het patroon en het onderwerp wordt gecontroleerd sinds PHP 4.3.5. Een ongeldig onderwerp zorgt ervoor dat de preg_ * -functie niets overeenkomt; een ongeldig patroon veroorzaakt een fout van niveau E_WARNING. UTF-8-sequenties van vijf en zes octetten worden als ongeldig beschouwd sinds PHP 5.3.4 (resp. PCRE 7.3 2007-08-28); voorheen werden die als geldige UTF-8 beschouwd.
In Python 2.x is de re.UNICODE
alleen van invloed op het patroon zelf: maak \w
, \W
, \b
, \B
, \d
, \D
, \s
en \S
afhankelijk van de database met eigenschappen van Unicode-tekens.
Een inline-versie: (?u)
in Python, (?U)
in Java. Bijvoorbeeld:
print(re.findall(ur"(?u)\w+", u"Dąb")) # [u'D\u0105b']
print(re.findall(r"\w+", u"Dąb")) # [u'D', u'b']
System.out.println("Dąb".matches("(?U)\\w+")); // true
System.out.println("Dąb".matches("\\w+")); // false
PCRE_DOLLAR_ENDONLY modifier
De PCRE-compatibele PCRE_DOLLAR_ENDONLY modifier die de $
anchor-match aan het einde van de string maakt (exclusief de positie voor de laatste nieuwe regel in de string).
/^\d+$/D
is gelijk aan
/^\d+\z/
en komt overeen met een hele reeks die bestaat uit 1 of meer cijfers en komt niet overeen met "123\n"
, maar wel met "123"
.
PCRE_ANCHORED modifier
Nog een PCRE-compatibele modifier uitgedrukt met /A
modifier. Als deze modificator is ingesteld, wordt het patroon gedwongen "verankerd" te zijn, dat wil zeggen, het is beperkt om alleen overeen te komen aan het begin van de string waarnaar wordt gezocht (de "subject string"). Dit effect kan ook worden bereikt door geschikte constructies in het patroon zelf, wat de enige manier is om het in Perl te doen.
/man/A
is hetzelfde als
/^man/
PCRE_UNGREEDY modifier
De PCRE-compatibele PCRE_UNGREEDY vlag uitgedrukt met /U
Het verandert hebzucht in een patroon: /a.*?b/U
= /a.*b/
en vice versa.
PCRE_INFO_JCHANGED modifier
Nog een PCRE-modifier die het gebruik van dubbele benoemde groepen mogelijk maakt.
OPMERKING : alleen inline- versie wordt ondersteund - (?J)
en moet aan het begin van het patroon worden geplaatst.
Als je gebruikt
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
de "val" groepswaarden zullen nooit leeg zijn (zullen altijd worden ingesteld). Een soortgelijk effect kan echter worden bereikt met een reset van de vertakking.
PCRE_EXTRA modifier
Een PCRE-modifier die een fout veroorzaakt als een backslash in een patroon wordt gevolgd door een letter die geen speciale betekenis heeft. Standaard wordt een backslash gevolgd door een letter zonder speciale betekenis als letterlijk beschouwd.
Eg
/big\y/
komt overeen met bigy
, maar
/big\y/X
zal een uitzondering veroorzaken.
Inline-versie: (?X)