Pattern (Java Platform SE 7) (Čeština)
Zkompilovaná reprezentace regulárního výrazu.
Regulární výraz určený jako řetězec musí být nejprve zkompilován do instance této třídy. Výsledný vzor pak lze použít k vytvoření Matcher
objektu, který může odpovídat libovolným znakovým sekvencím
proti regulárnímu výrazu. Ve stavu, který se účastní provádění zápasu, je umístěn v porovnávači, takže mnoho hráčů může sdílet stejný vzor.
Typická posloupnost vyvolání je tedy
Pattern p = Pattern.("a*b"); Matcher m = p.("aaaaab"); boolean b = m.();
Metoda matches
je touto třídou definována jako výhoda pro použití regulárního výrazu pouze jednou. Tato metoda kompiluje výraz a odpovídá vstupní sekvenci proti němu v jediném vyvolání. Výrok
boolean b = Pattern.matches("a*b", "aaaaab");
odpovídá třem výše uvedeným výrokům, ačkoli pro opakované shody je méně efektivní, protože neumožňuje znovu použít kompilovaný vzor.
Instance této třídy jsou neměnné a jsou bezpečné pro použití více souběžných vláken. Instance třídy Matcher
nejsou pro takové použití bezpečné.
Shrnutí konstruktů regulárního výrazu
Zpětná lomítka, úniky a citace
Znak zpětného lomítka („\“) slouží k zavedení uniklých konstruktů, jak jsou definovány v v tabulce výše, stejně jako citovat znaky, které by jinak byly interpretovány jako nezastavené konstrukce. Výraz \\ tedy odpovídá jednomu zpětnému lomítku a \ {odpovídá levé složené závorce.
Je chybou použít zpětné lomítko před jakýmkoli abecedním znakem, který neoznačuje uniklý konstrukt; ty jsou vyhrazeny pro budoucí rozšíření jazyka regulárních výrazů. Zpětné lomítko lze použít před nealfabetickým znakem bez ohledu na to, zda je tento znak součástí konstrukce bez úniku.
Zpětná lomítka v řetězcových literálech ve zdrojovém kódu Java jsou interpretována podle požadavků Specifikace jazyka Java ™ buď jako úniky Unicode (část 3.3), nebo jiné úniky znaků (část 3.10.6) Je proto nutné dvojitá zpětná lomítka v řetězcových literálech, které představují regulární výrazy, které je chrání před interpretací kompilátorem byte bytecode Java. Například řetězcový literál „\ b“ odpovídá jednomu znaku backspace, když je interpretován jako regulární výraz, zatímco „\\ b“ odpovídá hranici slova. Řetězcový literál „\ (ahoj \)“ je nezákonný a vede k chybě při kompilaci; pro shodu s řetězcem (ahoj) je nutné použít řetězcový literál „\\ (ahoj \\)“.
Třídy znaků
Třídy znaků se mohou objevit v jiných třídách znaků a mohou být složeny sjednocovacím operátorem (implicitní) a operátorem křižovatky (& &). Spojovací operátor označuje třídu, která obsahuje každý znak, který je alespoň v jedné z jeho tříd operandů. Operátor průniku označuje třídu, která obsahuje každý znak, který je v obou jeho třídách operandů.
Přednost operátorů třídy znaků je následující, od nejvyšší po nejnižší:
1 Doslovný únik \ x 2 Seskupení 3 rozsah az 4 Unie 5 Křižovatka ]
Všimněte si, že uvnitř třídy znaků je účinná jiná sada metaznaků než mimo třída znaků. Například regulární výraz. ztrácí svůj zvláštní význam uvnitř třídy znaků, zatímco výraz – se stává metaznakem tvořícím rozsah.
Zakončování řádků
Zakončování řádků je jedno nebo dvouznaková posloupnost, která označuje konec řádku vstupní posloupnosti znaků. Jako zakončení řádků jsou rozpoznáni následující:
Je-li aktivován režim UNIX_LINES
, jsou rozpoznávanými zakončení řádků pouze znaky nového řádku.
Regulární výraz. odpovídá libovolnému znaku kromě zakončení řádku, pokud není zadán příznak DOTALL
.
Ve výchozím nastavení regulární výrazy ^ a $ ignorují zakončení řádků a shodují se pouze na začátku a na konci celé vstupní sekvence. Pokud je aktivován režim MULTILINE
, pak ^ se shoduje na začátku vstupu a za jakýmkoli zakončovacím řádkem, kromě na konci vstupu. V MULTILINE
režimu $ odpovídá těsně před zakončením řádku nebo na konci vstupní sekvence.
Skupiny a zachycení
Číslo skupiny
Zachycení skupin je očíslováno počítáním jejich úvodních závorek zleva doprava.Ve výrazu ((A) (B (C))) existují například čtyři takové skupiny:
1 ((A) (B (C)))
2 (A)
3 (B (C))
4 (C)
Skupinová nula vždy znamená celý výraz.
Zachytávací skupiny jsou pojmenovány tak, protože během zápasu je uložena každá posloupnost vstupní sekvence, která odpovídá takové skupině. Zachycená subsekvence může být použita později ve výrazu prostřednictvím zpětného odkazu a může být také načtena z porovnávače, jakmile je operace shody dokončena.
Název skupiny
Skupině zachycujících lze také přiřadit „název“, skupinu zachycující pojmenování a poté na ni „později“ odkazovat. Názvy skupin se skládají z následujících znaků. První znak musí být písmeno.
Skupina pojmenovaná pro zachycení je stále očíslována, jak je popsáno v části Číslo skupiny.
Zachycený vstup přidružený ke skupině je vždy sekvence, které se skupina naposledy shodovala. Pokud je skupina vyhodnocena podruhé z důvodu kvantifikace, její dříve zachycená hodnota, pokud existuje, bude zachována, pokud druhé vyhodnocení selže. Porovnání řetězce „aba“ s výrazem (a (b)?) + Například ponechá skupinu dva nastavenou na „b“. Všechny zachycené vstupy jsou zahozeny na začátku každého zápasu.
Skupiny začínající na (? jsou buď čisté, nezachycující skupiny, které nezachycují text a nezapočítávají se do celkového počtu skupin, nebo pojmenované skupiny.
Podpora Unicode
Tato třída je v souladu s úrovní 1 technické normy Unicode č. 18: Regulární výraz Unicode plus kanonické ekvivalenty RL2.1.
Unicode escape sekvence, například \ u2014 ve zdrojovém kódu Java jsou zpracovávány tak, jak je popsáno v části 3.3 Specifikace jazyka Java ™. Tyto únikové sekvence jsou také implementovány přímo analyzátorem regulárních výrazů, takže úniky Unicode lze použít ve výrazech, které jsou čteny ze souborů nebo z klávesnice. Tedy řetězce “ \ u2014 „a“ \\ u2014 „, i když nejsou stejné, zkompilovat do stejného vzoru, který odpovídá znaku s hexadecimální hodnotou 0x2014.
Znak Unicode lze také reprezentovat v regulárním výrazu pomocí jeho hexadecimální notace (hexadecimální bodová hodnota kódu) přímo, jak je popsáno v konstrukci \ x {…}, pro příklad lze zadat doplňkový znak U + 2011F jako \ x {2011F}, místo dvou po sobě jdoucích sekvencí Unicode náhradní dvojice \ uD840 \ uDD1F.
Skripty, bloky, kategorie a binární vlastnosti Unicode jsou psány konstrukty \ p a \ P jako v Perlu. \ p {prop} odpovídá, pokud má vstup vlastnost prop, zatímco \ P {prop} neodpovídá, pokud má vstup tuto vlastnost.
Skripty, bloky, kategorie a binární vlastnosti lze použít uvnitř i vně třídy znaků.
Skripty se zadávají buď s předponou Is
, jako v IsHiragana
, nebo pomocí script
klíčové slovo (nebo jeho zkrácená podoba sc
) jako v script=Hiragana
nebo sc=Hiragana
.
Názvy skriptů podporované Pattern
jsou platné názvy skriptů přijaté a definované UnicodeScript.forName
.
Bloky jsou specifikovány předponou In
, jako v InMongolian
, nebo pomocí klíčového slova block
(nebo jeho zkrácený tvar blk
) jako v block=Mongolian
nebo blk=Mongolian
.
Názvy bloků podporované Pattern
jsou platné názvy bloků přijímané a definované UnicodeBlock.forName
.
Kategorie lze zadat pomocí volitelné předpony Is
: \p{L}
i \p{IsL}
označuje kategorii písmen Unicode. Stejně jako skripty a bloky lze kategorie specifikovat také pomocí klíčového slova general_category
(nebo jeho zkráceného tvaru gc
) jako v general_category=Lu
nebo gc=Lu
.
Podporované kategorie jsou kategorie standardu Unicode ve verzi určené třídou Character
. Názvy kategorií jsou názvy definované ve standardu, normativní i informativní.
Binární vlastnosti jsou specifikovány předponou Is
, jako v IsAlphabetic
.Podporované binární vlastnosti Pattern
jsou
- abecední
- ideografické
- písmeno
- Malá písmena
- Velká písmena
- Nadpis
- Interpunkce
- Ovládání
- White_Space
- Digit
- Hex_Digit
- Noncharacter_Code_Point
- Přiřazeno
Předdefinované třídy znaků a třídy znaků POSIX jsou v souladu s doporučením Příloha C: Vlastnosti kompatibility regulárního výrazu Unicode, když je zadán příznak UNICODE_CHARACTER_CLASS
.
Kategorie, které se chovají jako metody java.lang.Character boolean ismethodname (kromě těch zastaralých), jsou dostupné prostřednictvím stejné \ p {prop} syntaxe, kde má zadaná vlastnost název javamethodname.
Srovnání s Perlem 5
Motor Pattern
provádí tradiční shodu založenou na NFA s objednaným střídáním, jak se vyskytuje v Perlu 5.
Konstrukce Perlu, které tato třída nepodporuje:
Konstrukce podporované touto třídou, ale ne Perl:
-
Spojení a průnik znakové třídy, jak je popsáno výše.
Významné rozdíly od Perlu:
-
V Perlu jsou \ 1 až \ 9 vždy interpretovány jako zpětné odkazy; zpětné lomítko s číslem vyšším než 9 je považováno za zpětný odkaz, pokud existuje alespoň tolik podvýrazů, jinak je interpretováno, pokud je to možné, jako osmičkový únik. V této třídě musí osmičkové úniky vždy začínat nulou. V této třídě jsou \ 1 až \ 9 vždy interpretovány jako zpětné reference a větší počet je přijímán jako zpětná reference, pokud v daném bodě regulárního výrazu existuje alespoň tolik podvýrazů, jinak analyzátor vynechá číslice, dokud nebude číslo je menší nebo rovno stávajícímu počtu skupin nebo je to jedna číslice.
-
Perl používá příznak g k vyžádání shody, která bude pokračovat tam, kde poslední shoda skončila. Tuto funkčnost implicitně poskytuje třída
Matcher
: Opakovaná vyvolání metodyfind
se obnoví tam, kde poslední shoda skončila, pokud však nedojde k shodě je resetováno. -
V Perlu ovlivňují vložené příznaky na nejvyšší úrovni výrazu celý výraz. V této třídě se vložené příznaky vždy projeví v okamžiku, kdy se objeví, ať už jsou na nejvyšší úrovni nebo ve skupině; v druhém případě jsou příznaky obnoveny na konci skupiny stejně jako v Perlu.
Přesnější popis chování konstruktů regulárních výrazů naleznete v Mastering Regular Expressions, 3. vydání, Jeffrey EF Friedl, O „Reilly and Associates, 2006.