Regular Expressions
Regex-modifierare (flaggor)
Sök…
Introduktion
Vanliga uttrycksmönster används ofta med modifierare (även kallad flaggor ) som omdefinierar regex-beteende. Regex-modifierare kan vara vanliga (t.ex. /abc/i
) och inline (eller inbäddade ) (t.ex. (?i)abc
). De vanligaste modifierarna är globala, ärende-okänsliga, multiline och dotall modifierare. Regex-smaker skiljer sig emellertid i antalet stöds regex-modifierare och deras typer.
Anmärkningar
PCRE-modifierare
modifier | I kö | Beskrivning |
---|---|---|
PCRE_CASELESS | (? I) | Fall okänslig matchning |
PCRE_MULTILINE | (? M) | Flera linjematchningar |
PCRE_DOTALL | (? S) | . matchar nya linjer |
PCRE_ANCHORED | (? A) | Metatecken ^ matchar bara i början |
PCRE_EXTENDED | (? X) | Vita utrymmen ignoreras |
PCRE_DOLLAR_ENDONLY | n / a | Metatecken $ matchar bara i slutet |
PCRE_EXTRA | (? X) | Strikt flyttning |
PCRE_UTF8 | Hanterar UTF-8 tecken | |
PCRE_UTF16 | Hanterar UTF-16 tecken | |
PCRE_UTF32 | Hanterar UTF-32 tecken | |
PCRE_UNGREEDY | (? U) | Ställer in motorn till lat matchning |
PCRE_NO_AUTO_CAPTURE | (? :) | Inaktiverar autofångstgrupper |
Java-modifierare
Modifierare ( Pattern.### ) | Värde | Beskrivning |
---|---|---|
UNIX_LINES | 1 | Aktiverar Unix- linjeläge. |
FALLET OKÄNSLIG | 2 | Aktiverar match-okänslig matchning. |
KOMMENTARER | 4 | Tillåter utrymme och kommentarer i ett mönster. |
multi~~POS=TRUNC | 8 | Aktiverar multiline-läge. |
BOKSTAVLIG | 16 | Aktiverar bokstavlig tolkning av mönstret. |
dotall | 32 | Aktiverar dotall-läge. |
UNICODE_CASE | 64 | Aktiverar vikning av Unicode-medvetna. |
CANON_EQ | 128 | Aktiverar kanonisk ekvivalens. |
UNICODE_CHARACTER_CLASS | 256 | Aktiverar Unicode-versionen av fördefinierade teckenklasser och POSIX-teckenklasser. |
DOTALL-modifierare
Ett regex-mönster där en DOTALL-modifierare (i de flesta regex-smaker uttryckt med s
) ändrar beteendet hos .
så att den matchar en ny linje (LF) symbol:
/cat (.*?) dog/s
Denna regex i Perl-stil matchar en sträng som "cat fled from\na dog"
fångar "fled from\na"
till grupp 1.
En inlineversion: (?s)
(t.ex. (?s)cat (.*?) dog
)
Obs : I Ruby är ekvivalent DOTALL-modifieraren m
, Regexp::MULTILINE
modifierare (t.ex. /a.*b/m
).
Obs! JavaScript tillhandahåller inte en DOTALL-modifierare, så a .
kan aldrig tillåtas matcha en ny linje-karaktär. För att uppnå samma effekt är en lösning nödvändig, t.ex. att ersätta alla .
s med en catch-all-karaktärsklass som [\S\s]
, eller en inte-inget karaktärsklass [^]
(men denna konstruktion kommer att behandlas som ett fel av alla andra motorer, och är därför inte bärbar).
MULTILINE-modifierare
Ett annat exempel är en MULTILINE-modifierare (vanligtvis uttryckt med m
flagga (inte i Oniguruma (t.ex. Ruby) som använder m
att beteckna en DOTALL-modifierare)) som gör att ^
och $
-ankare matchar början / slutet på en linje , inte start / slut av hela strängen.
/^My Line \d+$/gm
hittar alla rader som börjar med My Line
och innehåller sedan ett mellanslag och 1+ siffror upp till linjen.
En inlineversion: (?m)
(t.ex. (?m)^My Line \d+$
)
OBS! I Oniguruma (t.ex. i Ruby), och även i nästan alla textredigerare som stöder regexps, de ^
och $
ankare betecknar linje start / ändlägen som standard. Du måste använda \A
att definiera hela dokument / strängstart och \z
att beteckna dokumentet / strängen. Skillnaden mellan \Z
och \z
är att den förstnämnda kan matcha före den sista nylinjesymbolen (LF) i slutet av strängen (t.ex. /\Astring\Z/
hittar en matchning i "string\n"
) (utom Python, där \Z
beteendet är lika med \z
och \z
ankaret inte stöds).
IGNORE CASE-modifierare
Den vanliga modifieraren för att ignorera fall är i
:
/fog/i
kommer att matcha Fog
, foG
, etc.
Inlineversionen av modifieraren ser ut (?i)
.
Anmärkningar:
I Java antar som standard okänslig matchning att endast tecken i US-ASCII-charset matchas. Unicode-medvetna fall-okänslig matchning kan aktiveras genom att ange UNICODE_CASE
flaggan i samband med denna ( CASE_INSENSITIVE
) flagga . (t.ex. Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
). Några mer om detta finns på Case-Insensitive Matching i Java RegEx . UNICODE_CHARACTER_CLASS
kan också användas för att göra matchande Unicode medveten.
VERBOSE / COMMENT / IgnorePatternWhitespace-modifierare
Modifieraren som gör det möjligt att använda vitrummet i vissa delar av mönstret för att formatera det för bättre läsbarhet och för att tillåta kommentarer som börjar med #
:
/(?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
/
Exempel på en sträng: #word1here
. Observera att symbolen #
undgår att beteckna en bokstavlig #
som är en del av ett mönster.
Oöverskådligt vitt utrymme i det vanliga uttrycksmönstret ignoreras, undgå det för att göra det till en del av mönstret.
Vanligtvis behandlas vitrummet inuti karaktärsklasser ( [...]
) som ett bokstavligt vitrum, utom i Java.
Det är också värt att nämna att i PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost regex-smaker kan man använda (?#:...)
kommentarer i regex-mönstret.
Explicit Capture modifier
Detta är en .NET regex-specifik modifierare uttryckt med n
. Vid användning fångas inte namngivna grupper (som (\d+)
). Endast giltiga fångar är uttryckligen namngivna grupper (t.ex. (?<name> subexpression)
).
(?n)(\d+)-(\w+)-(?<id>\w+)
matchar hela 123-1_abc-00098
, men (\d+)
och (\w+)
skapar inte grupper i det resulterande matchningsobjektet. Den enda gruppen är ${id}
. Se demo .
UNICODE-modifierare
UNICODE-modifieraren, vanligtvis uttryckt som u
(PHP, Python) eller U
(Java), gör att regex-motorn behandlar mönstret och ingångssträngen som Unicode-strängar och mönster, gör mönstret korta klasser som \w
, \d
, \s
osv. Unicode-medveten.
/\A\p{L}+\z/u
är ett PHP-regex för att matcha strängar som består av 1 eller flera Unicode-bokstäver. Se regex demo .
Observera att /u
modifieraren i PHP gör det möjligt för PCRE-motorn att hantera strängar som UTF8-strängar (genom att slå på PCRE_UTF8
verb) och göra korta teckenklasser i mönstret Unicode medvetna (genom att aktivera PCRE_UCP
verb, se mer på pcre.org ) .
Mönster- och ämnessträngar behandlas som UTF-8. Denna modifierare är tillgänglig från PHP 4.1.0 eller senare på Unix och från PHP 4.2.3 på win32. UTF-8-giltighet för mönstret och motivet kontrolleras sedan PHP 4.3.5. Ett ogiltigt ämne får preg_ * -funktionen att matcha ingenting; ett ogiltigt mönster utlöser ett fel på nivå E_WARNING. Fem och sex oktett UTF-8-sekvenser betraktas som ogiltiga sedan PHP 5.3.4 (resp. PCRE 7.3 2007-08-28); tidigare har de betraktats som giltiga UTF-8.
I Python 2.x påverkar re.UNICODE
endast själva mönstret: Gör \w
, \W
, \b
, \B
, \d
, \D
, \s
och \S
beroende på Unicode-karaktärsegenskapens databas.
En inlineversion: (?u)
i Python, (?U)
i Java. Till exempel:
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 modifierare
Den PCRE-kompatibla PCRE_DOLLAR_ENDONLY- modifieraren som gör att $
ankaret matchar i slutet av strängen (exklusive positionen före den sista nylinjen i strängen).
/^\d+$/D
är lika med
/^\d+\z/
och matchar en hel sträng som består av 1 eller fler siffror och inte kommer att matcha "123\n"
, men kommer att matcha "123"
.
PCRE_ANCHORED modifierare
En annan PCRE-kompatibel modifierare uttryckt med /A
modifierare. Om denna modifierare är inställd tvingas mönstret att "förankras", det vill säga det är begränsat att matcha bara i början av strängen som söks ("ämnessträngen"). Denna effekt kan också uppnås genom lämpliga konstruktioner i själva mönstret, vilket är det enda sättet att göra det i Perl.
/man/A
är det samma som
/^man/
PCRE_UNGREEDY modifierare
Den PCRE-kompatibla PCRE_UNGREEDY-flaggan uttryckt med /U
Det växlar girighet i ett mönster: /a.*?b/U
= /a.*b/
och vice versa.
PCRE_INFO_JCHANGED modifierare
Ytterligare en PCRE-modifierare som tillåter användning av duplicerade namngivna grupper.
OBS : endast inlineversion stöds - (?J)
och måste placeras i början av mönstret.
Om du använder
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
gruppvärdena "val" kommer aldrig att vara tomma (kommer alltid att ställas in). En liknande effekt kan dock uppnås med återställning av gren.
PCRE_EXTRA-modifierare
En PCRE-modifierare som orsakar ett fel om något bakslag i ett mönster följs av en bokstav som inte har någon speciell betydelse. Som standard behandlas ett motstreck följt av en bokstav som inte har någon speciell betydelse som en bokstavlig.
T.ex
/big\y/
kommer att matcha bigy
, men
/big\y/X
kommer att kasta ett undantag.
Inline version: (?X)