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)



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow