Regulární výrazy. Rudolf Pecinovský

Podobné dokumenty
Regulární výrazy. Motto:

Regulární výrazy. Vzory

HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT

Úvod do UNIXu. Okruh č. 4 - vi, regulární výrazy, grep a sed. Jakub Galgonek. verze r2. inspirováno materiály Davida Hokszy

Programování. Bc. Veronika Tomsová

Výčtový typ strana 67

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Algoritmizace a programování


Paměť počítače. alg2 1

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

PHP tutoriál (základy PHP snadno a rychle)

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

Formátové specifikace formátovací řetězce

Programovací jazyk Pascal

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Textové soubory. alg9 1

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Konečný automat. Jan Kybic.

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

1-Úvod. Automaty a gramatiky(bi-aag) Plán přednášky. 8. Regulární výrazy - aplikace

- jak udělat konstantu long int: L long velka = 78L;

Dynamicky vázané metody. Pozdní vazba, virtuální metody

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky.

Programování v Pythonu

Regulární výrazy. jemný úvod. Miloslav Brada

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

7. Datové typy v Javě

5. Ř etězce (třída String)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

9. přednáška - třídy, objekty

Algoritmizace a programování

Konstruktory překladačů

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/ Vzdělávání v informačních a komunikačních technologií

Příručka uživatele systému Museion. Quick filtr

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Regulární výrazy. Honza Vrbata

Úvod do programování - Java. Cvičení č.4

Úvod do programování. Lekce 1

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Obsah. Kapitola 1. Kapitola 2

DUM č. 5 v sadě. 34. Inf-10 Praktická typografie s LO Writer/MS Word

Objektově orientované programování v jazyce Python

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Úvod do programovacích jazyků (Java)

Nápověda k pokročilému vyhledávání

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Úvod do filtrace, Quick filtr

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Datové struktury. alg12 1

PROGRAMOVÁNÍ V SHELLU

FUNKCE 3. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

Objektově orientované programování

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Objektově orientované programování v jazyce Python

PSK3-9. Základy skriptování. Hlavička

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

Tabulkový procesor. Základní rysy

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Metodika. Architecture First. Rudolf Pecinovský

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Pokyny k vypracování absolventské práce

Programování v jazyce JavaScript

Algoritmizace a programování

15. Projekt Kalkulačka

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Automatická segmentace slov s pomocí nástroje Affisix. Michal@Hrusecky.net, Hlavacova@ufal.mff.cuni.cz

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

ALGORITMIZACE A PROGRAMOVÁNÍ

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Lokální definice (1) plocha-kruhu

8 Třídy, objekty, metody, předávání argumentů metod

Úvod Informace o prostředí Práce se soubory Regulární výrazy Konec. Programování v C# Soubory a regulární výrazy. Petr Vaněček 1 / 27

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Standardní algoritmy vyhledávací.

Zadání soutěžních úloh

Přednáška 4. Regulární výrazy. Filtry grep, sed a awk. Úvod do Operačních Systémů Přednáška 4

Lekce 2. Řetězce a práce s nimi. Vstup a výstup. C2184 Úvod do programování v Pythonu podzim 2016

Laboratorní práce: SNMP - Linux snmputils

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Proměnné a parametry. predn_08.odt :00:38 1

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Základní principy vyhledávání firem

typová konverze typová inference

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Java a XML. 10/26/09 1/7 Java a XML

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Regulární výrazy. Filtry grep, sed a awk.

Transkript:

Regulární výrazy Motto: Programátor musel jednou řešit zajímavý problém. Rozhodl se jej vyřešit použitím regulárních výrazů. Nyní musel řešit dva problémy. Rudolf Pecinovský rudolf@pecinovsky.cz Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 1 z 60

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 2 z 60 Obsah 1. Základní seznámení 2. Ověření správnosti navržených výrazů 3. Základní syntaxe vzorů regulárních výrazů 4. Nahrazování textu 5. Pokročilejší syntaxe 6. Použití regulárních výrazů v programu 7. Zdroje

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 3 z 60 1. Základní seznámení Obsah 1.1 Co to je 1.2 Datové typy používané při práci s regulárními výrazy 1.3 Princip použití

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 4 z 60 1.1 Co to je Nejsou regulérní, ale opravdu regulární Zavedené ve verzi 1.4, ale každá další verze je trochu vylepšila Regulární výraz = řetězec popisující vzor (předpis), podle nějž se: Rozhoduje o správné podobě zadaného řetězce V zadaném řetězci se vyhledává řetězec popsaný vzorem V zadaném řetězci se nahrazují výskyty řetězce popsaného jedním vzorem řetězcem popsaným jiným vzorem Příklady využití Validaci vstupů, kontroly formátu dat Dělení řetězce na části podle složitějších kritérií Vyhledávání specifikovaných textů v rozsáhlejších textech Hromadné vyhledávání a nahrazování Hromadné přejmenovávání souborů

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 5 z 60 1.2 Datové typy používané při práci s regulárními výrazy Všechny jsou definovány v balíčku java.util.regex Pattern vnitřní reprezentace programu definovaného daným regulárním výrazem; podle názvu třídy je označován jako pattern vzor MatchResult Rozhraní definující sadu zpráv, na něž musí umět reagovat výsledek hledání Matcher výsledek aplikace programu (vzoru) na zadaný text Implementuje rozhraní MatchResult, ale nabízí ještě další metody PatternSyntaxException výjimka popisující vzniklý problém

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 6 z 60 1.3 Princip použití 1. Uživatel (programátor) definuje zdrojový kód programu = regulární výraz 2. Výraz se přeloží a získá se jeho vnitřní reprezentace, tzv. vzor (pattern) instance třídy java.util.regex.pattern 3. Program aplikujeme na zadaný text a získáme výsledek hledání, který je instancí třídy java.util.regex.matcher 4. Této instance se pak můžeme ptát na nejrůznější informace o výsledku hledání získaného aplikací programu (regulárního výrazu) na zadaný text. Pattern p = Pattern.compile("a*b"); //Vnitřní reprezentace výrazu Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); //Anebo zkráceně boolean c = Pattern.matches("a*b", "aaaaab");

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 7 z 60 2. Ověření správnosti navržených výrazů Obsah 2.1 Možnosti předběžného ověření správnosti vzorů 2.2 Desktopový program 2.3 On-line ověřovač 2.4 Jednoduchý testovací program

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 8 z 60 2.1 Možnosti předběžného ověření správnosti vzorů Regulární výrazy bývají často velmi nepřehledné, a proto je při jejich návrhu velmi vhodné mít možnost si vše někde stranou nezávazně vyzkoušet Testovací program je sice jednoduchý, ale stejně dobře můžete použít i předpřipravené jednoúčelové testery, kterých je plný internet; Mnohé z nich lze získat zdarma Další řada z nich pracuje v on-line režimu, takže ani nepotřebujete příslušné prostředí Při výběru testovacího programu je třeba dát pozor na to, aby pracoval se regulárními výrazy platnými pro vaši platformu (Java, JavaScript,.NET, PHP, Python, Perl, Ruby, ) Programy na následujících stránkách pracují s regulárními výrazy podle definice platformy Java

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 9 z 60 2.2 Desktopový program Jednoduchý program, který najdete na disku I:

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 10 z 60 2.3 On-line ověřovač Aplet dostupný na adrese http:www.myregexp.com/signedjar.html

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 11 z 60 2.4 Jednoduchý testovací program Ekvivalent následujícího programu si můžete napsat sami /*************************************************************************** * V zadaném textu najde a vypíše všechny nalezené výskyty * textu odpovídajícho zadanému regulárnímu výrazu. * @param regexp Regulární výraz definující hledaný text * @param text Prohledávaný text */ public static void findall(string regexp, String text) { System.out.printf("Text: %s%nreg.exp.: %s%n", regexp, text); Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(text); } int i = 0; while (matcher.find()) { System.out.printf ("%2d. [%2d..%2d] «%s»%n", ++i, matcher.start(), matcher.end(), matcher.group()); }

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 12 z 60 3. Základní syntaxe vzorů regulárních výrazů Obsah 3.1 Jednotlivé znaky 3.2 Množiny znaků 3.2.1 Příklad 1 3.2.2 Příklad 2 3.3 Skupinové znaky 3.4 Hranice 3.4.1 Hranice ve víceřádkovém režimu 3.5 Práce se skupinami 3.5.1 Příklad 3.5.2 Pojmenované skupiny 3.6 Kvantifikátory (počet opakování) 3.6.1 Agresivita kvantifikátorů 3.7 Další operátory

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 13 z 60 3.1 Jednotlivé znaky S výjimkou znaků speciálního určení vystupuje každý znak sám za sebe Platí i escape-sekvence Javy: \\ \uhhhh \t \n \r \f \a \' \" Pro znak Escape (\u001b) lze použít \e Řídící znaky typu Ctrl+X je možno zadávat ve tvaru \cx Znak s kódem do 127 lze zadat také pomocí pouhých dvou číslic: \xhh V osmičkové soustavě lze znaky zadat jednou až třemi číslicemi: \0o \0oo \0ooo Znaky. ^ +? * $ ( [ { } ] ) vystupují jako metaznaky, takže chceme-li je zadat, musíme před nimi uvést zpětné lomítko např. \. Příklady text: Okolo "Hradce" v male zahradce Vzor: ad 1. [ 9..11] «ad» 2. [26..28] «ad» Vzor: \u0020\x22 1. [ 5.. 7] «"» Vzor: \x20 1. [ 5.. 6] 2. [12..13] 3. [14..15] 4. [19..20]

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 14 z 60 3.2 Množiny znaků [abc] Jeden ze znaků uvnitř závorek (zde a či b či c) POZOR! Uvnitř závorek se mění význam většiny metaznaků, které zde označují pouze samy sebe [^abc] Žádný ze znaků uvnitř závorek (cokoliv vyjma znaků a či b či c) [a-za-z] Rozsah znaků (zde znaky a až z a znaky A až Z včetně) [a-d[m-p]] Sjednocení (zde znaky a až d nebo znaky m až p) [a-z&&[^qw]] Průnik (zde znaky a až z s výjimkou znaků q a w) [a-z&&[^m-p]] Průnik (zde znaky a až z s výjimkou znaků m až p)

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 15 z 60 3.2.1 Příklad 1 Text: Okolo "Hradce" v male zahradce Vzor: o[^o] 1. [ 2.. 4] «ol» 2. [ 4.. 6] «o» Vzor: [A-Z] 1. [ 0.. 1] «O» 2. [ 6.. 7] «H» Vzor: [ ][^A-Z][a-z] 1. [14..17] «ma» 2. [19..22] «za»

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 16 z 60 3.2.2 Příklad 2 Text : Příliš žluťoučký kůň úpěl ďábelské ódy Vzor: [^\x00-\xff] znaky s diakritikou, které nejsou v západoevropské znakové sadě 1. [ 1.. 2] «ř» 2. [ 5.. 6] «š» 3. [ 7.. 8] «ž» 4. [10..11] «ť» 5. [13..14] «č» 6. [18..19] «ů» 7. [19..20] «ň» 8. [23..24] «ě» 9. [26..27] «ď» Chcete-li v množině povolených znaků uvést také znak (minus), musíte jej zadat buď jako poslední nebo jako escape sekvenci \-

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 17 z 60 3.3 Skupinové znaky. (tečka) Libovolný znak (uvnitř hranatých závorek však zastupuje jen sama sebe) \d Číslice, tj. [0-9] \D NEčíslice, tj. [^0-9] \s Bílý znak, tj. mezera, tabulátor, konec řádku, konec stránky \S NE bílý znak \w Znak [A-Za-z0-9_] \W Znak [^\w] Text: Okolo "Hradce" v male zahradce Vzor: \S\s\S 1: [ 4.. 7] «o "» 2: [13..16] «" v» 3: [20..23] «e z» Vzor:..\s.. 1: [ 3.. 8] «lo "H» 2: [12..17] «e" v» 3: [19..24] «le za» Vzor: \w\w\w\w 1: [ 4.. 8] «o "H» 2: [12..16] «e" v»

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 18 z 60 3.4 Hranice ^ Začátek řádku $ Konec řádku \b Hranice slova \B Není hranice slova \Q Začátek citace od tohoto místa přestávají platit metaznaky \E Konec citace opět začínají platit metaznaky \A Začátek vstupu \z Konec vstupu \Z Konec vstupu bez ukončovacího znaku \G Konec předchozí nalezené skupiny

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 19 z 60 3.4.1 Příklad Text: Okolo Hradce v malé zahrádce Vzor: \b\w+\b 1. [ 0.. 5] «Okolo» 2. [ 6..12] «Hradce» 3. [13..14] «v» Vzor: \b.a\s* 1. [15..19] «malé» 2. [20..28] «zahrádce» Vzor:...[eé]\b 1. [ 8..12] «adce» 2. [15..19] «malé» 3. [24..28] «ádce»

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 20 z 60 3.4.2 Hranice ve víceřádkovém režimu Znaky ^ a $ implicitně ignorují ukončení řádků a označují jen jejich začátek a konec, resp. u víceřádkových vstupů začátek a konec celého textu V režimu MULTILINE se jejich význam poněkud mění: ^ označuje pozici na počátku vstupu a za každým ukončením řádku s výjimkou konce vstupu $ označuje pozice před ukončeními řádků a pozici na konci celého vstupu

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 21 z 60 3.5 Práce se skupinami Skupiny jsou části výrazu uzavřené do kulatých závorek Chceme-li v textu hledat kulatou závorku, musím ji uvést zpětným lomítkem \( Skupiny je možno vnořovat Skupiny se označují svým pořadím, přičemž pořadí skupiny se počítá podle její otevírací závorky Java 7 zavedla možnost skupiny pojmenovat Výraz: ((A)(B(C)))(D) obsahuje následující skupiny: 0. ((A)(B(C)))(D) 1. ((A)(B(C))) 2. (A) 3. (B(C)) 4. (C) 5. (D) \n Obsah n-té skupiny Při nahrazování se na danou skupinu odvolává výrazem $n V Javě se nelze odvolávat na skupinu s pořadovým číslem >9, při více skupinách je nutno skupiny pojmenovávat viz dále pasáž Pojmenované skupiny

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 22 z 60 3.5.1 Příklad Vzor pro kontrolu zadání data: \b\d{1,2}([./-])\d{1,2}\1\d{4}\b Ověří, že mezi dnem a měsícem a mezi měsícem a rokem je stejný oddělovač tečka, pomlčka nebo lomítko. Text: 1.2.3456 2,3,4567 23-4-5678 4.5-6789 15/12/7890 123-45-6789 Hledání 1. [ 0-8] «1.2.3456» 2. [ 20-28] «23-4-5678» 3. [ 41-49] «15/12/7890» Oddělovač 1. [ 0-0] 2. [ 12-12] «2,3,4567» 3. [ 12-12] «4.5-6789» 4. [ 12-12] «123-45-6789»

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 23 z 60 3.5.2 Pojmenované skupiny Od verze 7.0 zavádí Java možnost definovat pojmenované skupiny, tj. skupiny, které lze pojmenovat a poté se na ně odkazovat jménem (?<jméno> ) Pojmenovaná skupina, pojmenování uzavíráme do špičatých závorek za úvodním otazníkem \k<jméno> Odvolávka na dříve se vyskytnuvší pojmenovanou skupinu ve vyhledávacím vzoru Vzor pro kontrolu zadání data nazveme-li skupinu obsahující oddělovač odd, získá výraz z předchozí části podobu: \d{1,2}(?<odd>[.\-/])\d{1,2}\k<odd>\d{4} Na pojmenované skupiny se nadále můžeme odvolávat i jejich indexem Výhody pojmenování oproti indexování Pojmenovaných skupin může být více než 9 Vložíme-li do výrazu další skupinu či z něj nějakou vyjmeme, odkazy na pojmenované skupiny upravovat nemusíme

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 24 z 60 3.6 Kvantifikátory (počet opakování)? 0 nebo 1 výskyt předchozího znaku + 1 a více výskytů předchozího znaku * Libovolný počet výskytů předchozího znaku (včetně 0) {n} Přesně n opakování předchozího znaku {n,} Minimálně n opakování předchozího znaku {m,n} Minimálně m a maximálně n opakování předchozího znaku Uvnitř hranatých závorek vystupují? + * jako obyčejné znaky Text: Příliš žluťoučký kůň úpěl ďábelské ódy Vzor: [\x00-\x7f&&[^ ]]{2,} výsledek je tomto případě ekvivalentní aplikaci vzoru \w{2,} 1: [ 3.. 5] «li» 2: [ 8..10] «lu» 3: [11..13] «ou» 4: [28..33] «belsk» 5: [36..38] «dy» Vzor: \s\s+\s (vzhledem k zahrnutým mezerám se musí nejprve najít další mezera) 1: [ 6..17] «žluťoučký» 2: [20..26] «úpěl»

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 25 z 60 3.6.1 Příklad: Vodácký pokřik Zadání: Definujte regulární výraz umožňující ověřit, že řetězec odpovídá vodáckému pokřiku public static void ahoj() { String[] as = {"ahj", "ahoj", "ahooj", "ahoooj"}; for( String s : as ) { String t = "aho+j"; System.out.println(s + " == " + s.matches( t ) ); } }

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 26 z 60 3.6.2 Agresivita kvantifikátorů Přidáme-li za kvantifikátor znak?, převedeme kvantifikátor na zdráhavý (reluctant); ten zabere minimální počet znaků požadovaných vzorem Zdráhavé kvantifikátory se někdy označují jako líné lazy Standardní kvantifikátory jsou označovány jako hladové (greedy), protože spolknou všechny akceptovatelné znaky; pokud by však jejich hladovost měla být příčinou nevyhovění vzoru, jsou ochotny část spolknutých znaků vrátit Přidáme-li za kvantifikátor znak +, převedeme jej na lakomý (possessive); ten pracuje zpočátku stejně jako hladový, ale co jednou schvátí, to už nenavrátí Text: Okolo Hradce v male zahradce Zdráhavý vzor: ([aeo]).*?\1 1. [ 2-5] «olo» 2. [ 8-17] «adce v ma» 3. [ 18-28] «e zahradce» Hladový vzor: ([aeo]).*\1 1. [ 2-5] «olo» 2. [ 8-25] «adce v male zahra» Lakomý vzor: ([aeo]).*+\1 Nic nenalezeno

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 27 z 60 3.7 Další operátory XY X Y Znaky X a Y musí jít za sebou, Buď X nebo Y, kde za X a Y můžeme dosadit nejen znaky, ale i jejich posloupnosti a skupiny znaků \ Další znak nebude považován za metaznak \Q Další znaky až po \E budou citovány, tj. nebudou považovány za metaznaky \E Konec citace Navrhněte vzor, který by zkontroloval pořadové číslo měsíce (nezkontroluje jeho správnost, ale pouze to, že za ně lze dané číslo považovat) \b((1[012]) [1-9])\b Obdobně bychom mohli navrhnout výraz kontrolující základní pravidla pro číslo dne: \b((3[01]) ([12][0-9]) [1-9])\b

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 28 z 60 4. Nahrazování textu Obsah 4.1 Základy 4.1.1 Příklad: Datum 4.1.2 Příklad: Záměna křestních jmen a příjmení

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 29 z 60 4.1 Základy V nahrazovacím regulárním výrazu uvedeme, čím budeme chtít nahradit každý nalezený text odpovídající hledanému výrazu Na skupiny znaků v nalezeném se můžeme odvolávat pomocí $n, kde n je číslo skupiny, jejíž nalezený text chceme na daném místě použít Na pojmenované skupiny se odkazujeme výrazem ${název}

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 30 z 60 4.1.1 Příklad: Datum Úkol: Standardizovat tečku jako oddělovač použitý v datech Hledat: Nahradit: $1.$3.$4 \b(\d{1,2})([./-])(\d{1,2})\2(\d{4})\b Text: 1.2.3456 2,3,4567 3-4-5678 4.5-6789 5/6/7890 123-45-6789 Výsledek: 1.2.3456 2,3,4567 3.4.5678 4.5-6789 5.6.7890 123-45-6789 Kdybychom skupinu se separátorem oddělujícím části data v předchozím příkladu označili sep (separátor), vypadal by vyhledávací vzor Hledat: Zbytek se shoduje \b(\d{1,2})(?<sep>[./-])(\d{1,2})\k<sep>(\d{4})\b

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 31 z 60 4.1.2 Příklad: Záměna křestních jmen a příjmení Bez pojmenovaných skupin: Hledat: Nahradit: $5 $1 Text: ((\w+)(\s+(\w+))?)\s+(\w+) John Fitzgerald Kennedy, Elton John, Martin Luther King Výsledek: Kennedy John Fitzgerald, John Elton, King Martin Luther Pokud skupinu pro příjmení pojmenujeme: Hledat: ((\w+)(\s+(\w+))?)\s+(?<surname>\w+) Nahradit: ${surname} $1 Text i výsledek jsou shodné Uvedený výraz ale nelze použít pro znaky s diakritikou; jak na to bude vysvětleno dále

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 32 z 60 5. Pokročilejší syntaxe Obsah 5.1 Speciální režimy a třídy znaků 5.1.1 Nastavení a zrušení speciálních režimů 5.2 Třídy znaků 5.2.1 Příklad: Záměna křestních jmen a příjmení s diakritikou 5.3 Nezachytávající skupiny (?: ) 5.3.1 Příklad 5.4 Nahlížení vpřed či vzad 5.4.1 Příklad: prohození křestního jména (křestních jmen) a příjmení

5.1 Speciální režimy a třídy znaků d UNIX_LINES Jako konec řádku pro metaznaky. ^ $ se bude rozpoznávat pouze znak \n i CASE_INSENSITIVE Při vyhledávání se přestane rozlišovat velikost znaků m MULTILINE Zapíná jinou interpretaci znaků ^ a $. Při zapnutí režimu definují pozice v okolí konců řádků, při vypnutém označují pouze začátek a konec celé sekvence s DOTALL V tomto režimu představuje metaznak tečka opravdu všechny znaky včetně konců řádků, které v běžném režimu nezahrnuje. u UNICODE_CASE V režimu CASE_INSENSITIVE se budou považovat velká a malá písmena za shodná podle definic normy Unicode. Standardně to platí jen pro ASCII znaky U UNICODE_CHARACTER_CLASS Při nastavení režimu se budou třídy znaků klasifikovat podle Unicode Standard #18 x COMMENTS Umožní vkládání komentářů začínajících znakem # a končících na konci řádku Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 33 z 60

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 34 z 60 5.1.1 Nastavení a zrušení speciálních režimů Uvnitř regulárního výrazu se režimy nastavují a vypínají pomocí sekvence (?idmsuxu-idmsuxu) v níž se uvádějí na předchozí stránce vypsané znaky pro nastavení, resp. vypnutí (pak předchází znak -) příslušného režimu Režim lze zapnout či vypnout i pouze pro určitou skupinu pomocí sekvence (?idmsuxu-idmsuxu:xxx) kde XXX představuje danou skupinu Nastavení režimu se neřadí mezi zachytávané skupiny, a proto se jejich závorky nepočítají Text: Okolo Hradce v malé zahrádce Vzor: hr 1. [22-24] «hr» Vzor: (?i)hr 1. [ 6-8] «Hr» 2. [22-24] «hr»

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 35 z 60 5.2 Třídy znaků \p{lower} Malá písmena \p{ Upper} Velká písmena \p{ ASCII} Znaky ASCII [\x00-\x7f] \p{alpha} Písmena: [\p{lower}\p{upper}] \p{digit} Dekadické číslice: [0-9] \p{alnum} Alfanumerické znaky: [\p{alpha}\p{digit}] \p{punct} Oddělovače Jeden ze znaků!"#$%&'()*+,-./:;<=>?@[\]^_`{ }~ \p{graph} Viditelné znaky: [\p{alnum}\p{punct}] \p{print} Tisknutelné znaky: [\p{graph}\x20] \p{blank} Mezera nebo tabulátor: [ \t] \p{cntrl} Řídící znaky: [\x00-\x1f\x7f] \p{xdigit } Hexadecimální číslice: [0-9a-fA-F] \p{space } Bílý znak: [ \t\n\x0b\f\r]

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 36 z 60 5.2.1 Příklad: Záměna křestních jmen a příjmení s diakritikou Opět prohazujeme křestní jména a příjmení, ale tentokrát chceme aplikovat nahrazování i pro jména obsahující znaky s diakritikou Hledat: Nahradit: ${surname} $1 Text: Výsledek: (?U:((\p{Alpha}+)(\s+(\p{Alpha}+))?)\s+(?<surname>\p{Alpha}+)) John Fitzgerald Kennedy, Elton John, Josef Václav Sládek, Přemysl Oráč Kennedy John Fitzgerald, John Elton, Sládek Josef Václav, Oráč Přemysl

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 37 z 60 5.3 Nezachytávající skupiny (?: ) Doposud probírané skupiny byly zachytávané Zachytávané skupiny se tak jmenují proto, že jejich obsah je zachycen a uložen pro případné budoucí použití. Nezachytávané skupiny specifikují pouze pozici v prohledávaném textu, přičemž tato pozice je určena zadaným výrazem Nezachytávané skupiny se nepočítají, protože se na ně stejně nedá odkazovat, při odkazu na nějakou předchozí skupinu se počítají pouze ty zachytávané Někdy potřebujeme ověřit, že nějaká skupina v prohledávaném textu je, ale nebudeme ji pak už potřebovat, takže si ji ani nemusíme pamatovat Nemusíme-li si skupinu pamatovat, můžeme tím zefektivnit vyhledávání To, že se nečíslují, se hodí v případě více skupin

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 38 z 60 5.3.1 Příklad Text: 1.2.3456 2,3,4567 3.4.5678 4.5-6789 5.6.7890 12.3.4567 12/34/5678 30-12-9876 Budeme-li chtít ověřit základní pravidla zápisu data, může mít vzor tvar:: \b((?:3[01]) (?:[12][0-9]) [1-9])([./-])((?:1[012]) [1-9])\2(\d{4})\b 1. [ 1-9] «1.2.3456» 2. [ 21-29] «3.4.5678» 3. [ 41-49] «5.6.7890» 4. [ 50-59] «12.3.4567» 5. [ 72-82] «30-12-9876» Pro sjednocení oddělovačů použijeme nahrazovací výraz: $1;$3;$4 1;2;3456 2,3,4567 3;4;5678 4.5-6789 5;6;7890 12;3;4567 12/34/5678 30;12;9876

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 39 z 60 5.4 Nahlížení vpřed či vzad V řadě případů může být naše další rozhodování ovlivněno tím, jestli jsme již narazili na nějaký text anebo jestli na něj v budoucnu narazíme k takovémuto nahlížení slouží konstrukce: (?= ) Pozitivní náhled vpřed (?! ) Negativní náhled vpřed (?<= ) Pozitivní náhled vzad (?<! ) Negativní náhled vzad Pozitivní náhled povolí interpretaci další částí regulárního výrazu v případě, kdy se v daném směru popsaný text vyskytuje, negativní náhled v případě, kdy se popsaný text v daném směru nevyskytuje Náhledy text nekonzumují, pouze zjistí přítomnost či nepřítomnost textu, takže se tento text může stát součástí dalšího zpracování Vhodným použitím náhledů můžeme např. specifikovat pozici, kam se bude vkládat nějaký text Prozkoumávací skupiny probíráme až teď, protože se uplatní především při nahrazování textu

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 40 z 60 5.4.1 Příklad: Vložení oddělovačů tisíců do velkých čísel Text: 12345678 chceme do něj vložit oddělovače tisíců Hledat: (\d)(?=(\d\d\d)+(?!\d)) Nahradit: $1, Text: 123; 1234; 12345; 123456; 1234567; 12345678; 123456789 Výsledek: 123; 1,234; 12,345; 123,456; 1,234,567; 12,345,678; 123,456,789

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 41 z 60 5.5 Atomická nezachytávaná skupina Syntaxe: (?> ) Atomická skupina se chová podobně jako lakomý kvantifikátor: jakmile je tato skupina v textu nalezena, už takovou navždy zůstane, jinými slovy už z ní nebude možno něco odebrat, aby celý výraz vyšel Výhodou lakomých kvantifikátorů oproti atomickým skupinám je to, že lakomé kvantifikátory lze lépe optimalizovat

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 42 z 60 6. Použití regulárních výrazů v programu Obsah 6.1 Třída Pattern 6.1.1 Metody třídy Pattern 6.1.2 Příznaky ovlivňující překlad veřejné atributy třídy Pattern 6.1.3 Rozdělení řetězce na částí 6.1.4 Ostatní metody instancí třídy Pattern 6.2 Rozhraní MatchResult 6.3.1 Metody řídící vyhledávání 6.3.2 Ovlivnění chodu vyhledávače 6.3.3 Nahrazováni 6.4 Příklady 6.4.1 Vodácký pokřik 6.4.2 Mohl by to být identifikátor? 6.4.3 Rozdělení textu na slova 6.3 Třída Matcher

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 43 z 60 6.1 Třída Pattern Instance třídy Pattern představují vnitřní reprezentace přeložených regulárních výrazů Každý regulární výraz musí být před použitím přeložen Teprve přeložený regulární výraz můžeme požádat o poskytnutí vyhledávače (matcher), který bude analyzovat dodaný text

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 44 z 60 6.1.1 Metody třídy Pattern static Pattern compile(string regex) static Pattern compile(string regex, int flags) Přeloží zadaný text a vytvoří nový vzor při respektování případných zadaných příznaků Příznaky jsou celá čísla s jediným, nahozeným bitem, takže je můžeme skládat prostřednictvím sčítání nebo bitového OR ( ) static boolean matches(string regex, CharSequence input) Přeloží zadaný regulární výraz regex a ověří, zda mu text input vyhovuje static String quote(string s) Vrátí text, jehož překladem vznikne vzor, kterému bude zadaný text vyhovovat

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 45 z 60 6.1.2 Příznaky ovlivňující překlad veřejné atributy třídy Pattern CANON_EQ Písmeno následované akcentem považuje za znak s daným akcentem CASE_INSENSITIVE Nedbá na velikost písmen COMMENTS Ignoruje mezery a povoluje komentáře začínající znakem # DOTALL V tomto režimu zastupuje znak. (tečka) také konce řádků (jinak ne) LITERAL Metaznaky považuje za normální znaky MULTILINE Umožňuje vyhledávat konce řádků

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 46 z 60 UNICODE_CASE Ignorace velikosti znaků odpovídá standardu Unicode UNICODE_CHARACTER_CLASS Novinka Javy 7 umožňuje, aby se do jednotlivých tříd započítávaly i znaky ze sady Unicode Toto nastavení může výrazně zpomalit vyhodnocování výrazů UNIX_LINES Za konec řádku je považován pouze \n

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 47 z 60 6.1.3 Rozdělení řetězce na částí String[] split(charsequence input) String[] split(charsequence inp, int limit) Vrátí pole podřetězců řetězců zadaného textu daným vzorem s respektováním pořadí. Neobsahuje-li text daný vzor, je vrácen celý. Parametr limit specifikuje maximální povolenou velikost pole, tj. počet vyhledávání daného vzoru v textu. Není-li kladný, není počet vracených řetězců omezen, tj. regulárním výrazem zadaný oddělovač se bude vyhledávat až do konce zadaného textu Je-li parametr limit kladný, je posledním vráceným řetězcem veškerý zbylý text za limit-ním nalezeným oddělovačem Předchozí metody lze vyvolat i prostřednictvím metod třídy String public String[] split(string regex) public String[] split(string regex, int limit) Vrátí pole řetězců obsažených v původním řetězci a oddělených texty odpovídajícími regulárnímu výrazu v parametru

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 48 z 60 6.1.4 Ostatní metody instancí třídy Pattern int flags() Vrátí číslo, z nějž lze odvodit nastavené příznaky Použití např.: if (pattern.flags() & Pattern.COMMENTS) { } Matcher matcher(charsequence input) Vytvoří vyhledávač vzoru v zadaném textu String pattern() String tostring() Vrátí text, jehož překladem vznikl daný vzor

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 49 z 60 6.2 Rozhraní MatchResult Instance tohoto rozhraní jsou výsledky aplikace vzoru na text. Jejich metody umožňují jistou analýzu obdrženého výsledku int end() int end(int group) Vrátí index znaku za posledním znakem nalezené/zadané skupiny String group() String group(int group) Vrátí další, resp. zadanou skupinu odpovídající vzoru int groupcount() Vrátí počet nalezených výskytů vzoru v textu int start() int start(int group) Vrátí index prvního znaku nalezené/zadané skupiny

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 50 z 60 6.3 Třída Matcher Instance třídy Matcher fungují jako interprety programu definovaného regulárním výrazem a pracujícími se zadaným textem jako zdrojem dat Při práci se používají tři metody: matches() zjišťuje, zda text přesně odpovídá vzoru lookingat() zjistí, zda je text odpovídající vzoru ve vstupním textu obsažen find() hledá případný další výskyt daného textu Vyhledávač (matcher) nemusí hledat v celém textu, ale lze mu zadat pouhé okénko region Vedle vyhledávání a kontrolování je vyhledávač schopen také ve vstupním textu nahrazovat jedny sekvence znaků jinými. Vyhledávač je možné resetovat a při té příležitosti mu zadat jiný vstupní text Instance vyhledávače nejsou vláknově bezpečné, při použití ve vícevláknových aplikacích je na to třeba myslet

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 51 z 60 6.3.1 Metody řídící vyhledávání boolean matches() Zjistí, jestli (celý) text v oblasti odpovídá danému vzoru boolean lookingat() Zjistí, jestli se v textu nachází pasáž odpovídající danému vzoru; hledá vždy od začátku oblasti boolean find() boolean find(int start) Pokusí se najít další pasáž odpovídající danému vzoru MatchResult tomatchresult() Vrátí objekt s informacemi o výsledcích porovnávání boolean hitend() Oznámí, zda bylo při posledním hledání dosaženo konce vstupu boolean requireend() Oznámí, zda by další vstupující text mohl ovlivnit úspěšnost nalezení textu odpovídajícího danému vzoru

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 52 z 60 6.3.2 Ovlivnění chodu vyhledávače Pattern pattern() Vrátí vzor, vůči němuž se prověřuje zadaný text Matcher usepattern(pattern newpattern) Změní vzor, který bude v textu vyhledáván, nemění se však aktuální pozice v prohledávaném textu Matcher region(int start, int end) Nastaví nové meze prohledávané oblasti v textu int regionend() Vrátí index konce prohledávané oblasti int regionstart() Vrátí index počátku prohledávané oblasti Matcher reset() Matcher reset(charsequence input) Resetuje vyhledávač, v druhém případě jej nastaví na zadaný text. Současně nastaví aktuální oblast (region) na celý text. Neovlivní nastavení ukotvení okrajů (viz dále)

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 53 z 60 boolean hasanchoringbounds() Oznámí, zda má aktuální oblast ukotvené okraje, tj. zda lze její počátek označit metaznakem ^ a konec metaznakem $. boolean hastransparentbounds() Oznámí, zda má aktuální oblast průhledné okraje, tj. jestli dopředné či zpětné nahlédnutí (lookahead, lookbehind) vidí I za ně Matcher useanchoringbounds(boolean b) Nastaví (resp. zruší jejich nastavení) ukotvení okrajů Matcher usetransparentbounds(boolean b) Nastaví (resp. zruší jejich nastavení) průhlednosti okrajů

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 54 z 60 6.3.3 Nahrazováni String replacefirst(string replacement) String replaceall(string replacement) Nahradí první(všechny) výskyt(y) vzoru zadaným řetězcem Matcher appendreplacement(stringbuffer sb, String replacement) Přidá na konec zadaného StringBufferu text projitý při posledním hledání přičemž nalezený výraz na konci zadaným způsobem nahradí StringBuffer appendtail(stringbuffer sb) Přidá na konec zadaného StringBufferu doposud neprojitý text, tj. text za posledním nalezeným výskytem vzoru static String quotereplacement(string s) Vrátí text, kterým by se nahrazoval nalezený text. Nesubstituuje však skupiny a místo nalezených dvojic $n, kde n je číslo skupiny, vkládá do výstupního textu pouze \n. Další možností je využít metod třídy String: public String replacefirst(string regex, String replacement) public String replaceall(string regex, String replacement) Jejich volání se pouze převede na volání stejnojmenných metod třídy Matcher, např.: Pattern.compile(regex).matcher(str).replaceAll(repl)

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 55 z 60 Princip postupného nahrazování textu public class TestujICPU { public static void Replace() { Pattern p = Pattern.compile("cat"); Matcher m = p.matcher("one cat two cats in the yard"); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendreplacement(sb, "dog"); } m.appendtail(sb); System.out.println(sb.toString()); } } //Tiskne: one dog two dogs in the yard

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 56 z 60 6.4 Příklady Na následujících stránkách najdete několik jednoduchých příkladů řešených programem využívajícím regulární výrazy

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 57 z 60 6.4.1 Vodácký pokřik Zadání: Definujte regulární výraz umožňující ověřit, že řetězec odpovídá vodáckému pokřiku public static void ahoj() { String[] as = {"ahj", "ahoj", "ahooj", "ahoooj"}; for( String s : as ) { String t = "aho+j"; System.out.println(s + " == " + s.matches( t ) ); } }

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 58 z 60 6.4.2 Mohl by to být identifikátor? Zadání: Napište regulární výraz, pomocí kterého je možno zjistit, zda lze v Javě považovat zadaný řetězec za identifikátor public static void identifikátor() { String[] as = { "12a", "_123", "$a7", "_$_" }; String rv = "[\\$\\w&&\\d][\\w\\$]*"; for( String s : as ) { System.out.println( s + " == " + s.matches( rv ) ); } } Identifikátor je posloupnost alfanumerických znaků a znaku $ nezačínající číslicí Předchozí vzor neakceptuje znaky s diakritikou

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 59 z 60 6.4.3 Rozdělení textu na slova Zadání: Rozdělte text na slova public static void slova() { String[] as = { "a b c d", "a b c de" }; String rv = "\\s+"; for( String s : as ) { String[] ss = s.split( rv ); System.out.print( s + " == " ); for( String w : ss ) System.out.print( w + "*" ); System.out.println(); } } Druhé dva řádky ukazují výsledek, kdybychom v regulárním výrazu vynechali kvantifikátor + za označením bílého znaku

Copyright Rudolf Pecinovský, Soubor: Regularni_vyrazy.doc, verze 2.00.2549, uloženo po 9.11.2015 10:33 60 z 60 7. Zdroje WATT Andrew: Beginning Regular Expressions. Wiley Publishing, Inc. 2005, ISBN-10: 0-7645-7489-2. FRIEDL Jeffrey E. F.: Mastering Regular Expressions 3 rd Edition. O Reilly 2006, ISBN-10: 0-596-52812-4. GOYVAERTS Jan, LEVITHAN Steven: Regular Expressions Cookbook. O Reilly 2006, ISBN-13: 978-0-596-52068-7 The Java Tutorial, Fourth Edition Lesson: Regular Expressions. http://download.oracle.com/javase/tutorial/essential/regex/index.html Java 7 API Documentation: http://download.oracle.com/javase/7/docs/api/