Regular Expressions
Modyfikatory Regex (flagi)
Szukaj…
Wprowadzenie
Wzory wyrażeń regularnych są często używane z modyfikatorami (zwanymi także flagami ), które na nowo definiują zachowanie wyrażeń regularnych. Modyfikatory Regex mogą być regularne (np. /abc/i
) i wbudowane (lub osadzone ) (np. (?i)abc
). Najczęstszymi modyfikatorami są modyfikatory globalne, bez rozróżniania wielkości liter, modyfikatory wieloliniowe i dotall. Jednak smaki wyrażeń regularnych różnią się liczbą obsługiwanych modyfikatorów wyrażeń regularnych i ich typami.
Uwagi
Modyfikatory PCRE
Modyfikator | Inline | Opis |
---|---|---|
PCRE_CASELESS | (?ja) | Dopasowanie bez rozróżniania wielkości liter |
PCRE_MULTILINE | (? m) | Dopasowywanie wielu linii |
PCRE_DOTALL | (? s) | . dopasowuje nowe linie |
PCRE_ANCHORED | (?ZA) | Metaznak ^ pasuje tylko na początku |
PCRE_EXTENDED | (? x) | Białe spacje są ignorowane |
PCRE_DOLLAR_ENDONLY | nie dotyczy | $ Meta-postaci dopasowuje tylko na końcu |
PCRE_EXTRA | (? X) | Dokładna analiza ucieczki |
PCRE_UTF8 | Obsługuje UTF-8 | |
PCRE_UTF16 | Obsługuje UTF-16 | |
PCRE_UTF32 | Obsługuje UTF-32 | |
PCRE_UNGREEDY | (? U) | Ustawia silnik na leniwe dopasowanie |
PCRE_NO_AUTO_CAPTURE | (? :) | Wyłącza automatyczne przechwytywanie grup |
Modyfikatory Java
Modyfikator ( Pattern.### ) | Wartość | Opis |
---|---|---|
UNIX_LINES | 1 | Włącza tryb linii uniksowych . |
CASE_INSENSITIVE | 2) | Umożliwia dopasowanie bez rozróżniania wielkości liter. |
KOMENTARZE | 4 | Umożliwia spację i komentarze we wzorcu. |
MULTILINA | 8 | Włącza tryb multilinii. |
DOSŁOWNY | 16 | Umożliwia dosłowną analizę wzoru. |
DOTALL | 32 | Włącza tryb dotall. |
UNICODE_CASE | 64 | Umożliwia składanie skrzynek z obsługą Unicode. |
CANON_EQ | 128 | Umożliwia równoważność kanoniczną. |
UNICODE_CHARACTER_CLASS | 256 | Włącza wersję predefiniowanych klas znaków i klas znaków POSIX w Unicode. |
Modyfikator DOTALL
Wzorzec wyrażenia regularnego, w którym modyfikator DOTALL (w większości odmian wyrażeń regularnych wyrażonych za pomocą s
) zmienia zachowanie .
umożliwiając dopasowanie symbolu nowej linii (LF):
/cat (.*?) dog/s
Ten wyrażenie regularne w stylu Perla będzie pasować do łańcucha 1 w rodzaju "cat fled from\na dog"
przechwytującego "fled from\na"
.
Wersja inline: (?s)
(np. (?s)cat (.*?) dog
)
Uwaga : W Ruby odpowiednikiem modyfikatora DOTALL jest m
, modyfikator /a.*b/m
Regexp::MULTILINE
(np. /a.*b/m
).
Uwaga : JavaScript nie zapewnia modyfikatora DOTALL, więc a .
nigdy nie można dopasować znaku nowej linii. Aby osiągnąć ten sam efekt, konieczne jest obejście tego problemu, np. Zastąpienie wszystkich .
s z klasą znakową typu catch-all, taką jak [\S\s]
, lub klasą [^]
nic” [^]
(jednak konstrukcja ta będzie traktowana jako błąd przez wszystkie inne silniki, a zatem nie jest przenośna).
Modyfikator MULTILINE
Innym przykładem jest modyfikator MULTILINE (zwykle wyrażany za pomocą flagi m
(nie w Oniguruma (np. Ruby), który używa m
do oznaczenia modyfikatora DOTALL)), który sprawia, że kotwice ^
i $
pasują do początku / końca linii , a nie do początku / końca całego ciągu.
/^My Line \d+$/gm
znajdzie wszystkie linie, które zaczynają się od My Line
, a następnie zawierają spację i cyfry 1+ aż do końca linii.
Wersja wbudowana: (?m)
(np. (?m)^My Line \d+$
)
UWAGA : W Oniguruma (np. W Ruby), a także w prawie każdym edytorze tekstu obsługującym wyrażenia regularne, kotwice ^
i $
domyślnie oznaczają pozycje początkową / końcową linii . Musisz użyć \A
aby zdefiniować początek dokumentu / łańcucha, a \z
aby oznaczyć koniec dokumentu / łańcucha. Różnica między \Z
i \z
polega na tym, że pierwsza z nich może pasować przed końcowym symbolem nowej linii (LF) na końcu ciągu (np. /\Astring\Z/
znajdzie dopasowanie w "string\n"
) (z wyjątkiem Python, gdzie zachowanie \Z
jest równe \z
a kotwica \z
nie jest obsługiwana).
Modyfikator IGNORE CASE
Wspólna modyfikator zignorować sprawę to i
:
/fog/i
pasuje do Fog
, foG
itp.
Wbudowana wersja modyfikatora wygląda jak (?i)
.
Uwagi:
W Javie domyślnie dopasowanie bez rozróżniania wielkości liter zakłada, że dopasowywane są tylko znaki w zestawie znaków US-ASCII. Dopasowywanie bez rozróżniania wielkości liter w rozpoznawaniu Unicode można włączyć, określając flagę UNICODE_CASE
w połączeniu z tą CASE_INSENSITIVE
( CASE_INSENSITIVE
) . (np. Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
). Więcej informacji na ten temat można znaleźć w Dopasowywanie bez rozróżniania wielkości liter w Java RegEx . Można również UNICODE_CHARACTER_CLASS
, aby UNICODE_CHARACTER_CLASS
pasujący Unicode.
VERBOSE / COMMENT / IgnorePatternWhitespace modyfikator
Modyfikator, który pozwala używać białych znaków wewnątrz niektórych części wzorca w celu sformatowania go w celu lepszej czytelności i umożliwienia komentarzy zaczynających się od #
:
/(?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
/
Przykład ciągu: #word1here
. Zauważ, że symbol #
jest ucieczką, aby oznaczać literał #
który jest częścią wzoru.
Nieokreślona biała przestrzeń we wzorcu wyrażeń regularnych jest ignorowana, należy uciec z niej, aby stała się częścią wzorca.
Zazwyczaj białe znaki w klasach znaków ( [...]
) są traktowane jak dosłowne białe znaki, z wyjątkiem Java.
Warto również wspomnieć, że w PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost wyrażenia regularne można używać komentarzy (?#:...)
wewnątrz wzorca wyrażenia regularnego.
Jawny modyfikator przechwytywania
Jest to modyfikator specyficzny dla wyrażenia regularnego .NET wyrażony przez n
. Gdy są używane, nienazwane grupy (jak (\d+)
) nie są przechwytywane. Tylko prawidłowe przechwytywania są wyraźnie nazwanymi grupami (np. (?<name> subexpression)
).
(?n)(\d+)-(\w+)-(?<id>\w+)
dopasuje cały 123-1_abc-00098
, ale (\d+)
i (\w+)
nie utworzą grup w wynikowym obiekcie dopasowania. Jedyną grupą będzie ${id}
. Zobacz demo .
Modyfikator UNICODE
Modyfikator UNICODE, zwykle wyrażany jako u
(PHP, Python) lub U
(Java), powoduje, że silnik regex traktuje wzorzec i łańcuch wejściowy jako ciągi i wzorce Unicode, czyni wzorzec stenograficznymi klasami takimi jak \w
, \d
, \s
itp. Zgodny z Unicode.
/\A\p{L}+\z/u
jest wyrażeniem regularnym PHP pasującym do ciągów znaków, które składają się z 1 lub więcej liter Unicode. Zobacz demo wyrażenia regularnego .
Zauważ, że w PHP modyfikator /u
umożliwia silnikowi PCRE obsługę ciągów znaków jako ciągów UTF8 (poprzez włączenie czasownika PCRE_UTF8
) i uczynienie klas znaków skróconych PCRE_UTF8
w Unicode (poprzez włączenie czasownika PCRE_UCP
, zobacz więcej na pcre.org ) .
Wzory i łańcuchy tematyczne są traktowane jako UTF-8. Ten modyfikator jest dostępny od wersji PHP 4.1.0 lub nowszej w systemie Unix oraz od wersji PHP 4.2.3 w wersji win32. Poprawność wzorca i tematu UTF-8 jest sprawdzana od PHP 4.3.5. Nieprawidłowy temat spowoduje, że funkcja preg_ * nie będzie pasować do niczego; niepoprawny wzorzec spowoduje błąd poziomu E_WARNING. Pięć i sześć oktetów sekwencji UTF-8 są uważane za nieprawidłowe od PHP 5.3.4 (odpowiednio PCRE 7.3 2007-08-28); poprzednio były one uważane za ważne UTF-8.
W Pythonie 2.x re.UNICODE
wpływa tylko na sam wzorzec: re.UNICODE
\w
, \W
, \b
, \B
, \d
, \D
, \s
i \S
od bazy danych właściwości znaków Unicode.
Wersja wbudowana: (?u)
w Pythonie, (?U)
w Javie. Na przykład:
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
Modyfikator PCRE_DOLLAR_ENDONLY
Modyfikator PCRE_DOLLAR_ENDONLY zgodny z PCRE, który sprawia, że kotwica $
dopasowuje się na samym końcu łańcucha (wyłączając pozycję przed ostatnim znakiem nowej linii).
/^\d+$/D
jest równe
/^\d+\z/
i dopasowuje cały ciąg, który składa się z 1 lub więcej cyfr i nie będzie pasował do "123\n"
, ale będzie pasował do "123"
.
Modyfikator PCRE_ANCHORED
Kolejny modyfikator zgodny z PCRE wyrażony za pomocą modyfikatora /A
Jeśli ten modyfikator jest ustawiony, wzorzec jest zmuszany do „zakotwiczenia”, to znaczy, że jest dopasowywany tylko na początku przeszukiwanego ciągu („ciąg tematu”). Efekt ten można również osiągnąć poprzez odpowiednie konstrukcje w samym wzorze, co jest jedynym sposobem na to w Perlu.
/man/A
jest taki sam jak
/^man/
Modyfikator PCRE_UNGREEDY
Flaga PCRE_UNGREEDY zgodna z PCRE wyrażona za pomocą /U
Przełącza chciwość we wzorcu: /a.*?b/U
= /a.*b/
i odwrotnie.
Modyfikator PCRE_INFO_JCHANGED
Jeszcze jeden modyfikator PCRE, który umożliwia stosowanie zduplikowanych nazwanych grup.
UWAGA : obsługiwana jest tylko wersja wbudowana - (?J)
i musi być umieszczona na początku wzorca.
Jeśli użyjesz
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
wartości grupy „val” nigdy nie będą puste (zawsze zostaną ustawione). Podobny efekt można jednak uzyskać po zresetowaniu gałęzi.
Modyfikator PCRE_EXTRA
Modyfikator PCRE, który powoduje błąd, jeśli po odwrotnym ukośniku we wzorcu następuje litera, która nie ma specjalnego znaczenia. Domyślnie odwrotny ukośnik, po którym następuje litera bez specjalnego znaczenia, jest traktowany jako literał.
Na przykład
/big\y/
dopasuje bigy
, ale
/big\y/X
wyrzuci wyjątek.
Wersja Inline: (?X)