Regulární výrazy v Javě
Co byste měli vědět.
Koncept regulárních výrazů pochází z 50. let minulého století. Jedná se o způsob vyhledávání informací v řetězcích pomocí vzorů zapsaných speciálními znaky.
Tuto technologii poprvé použil vývojář unixových systémů Ken Thompson v textovém editoru ed v roce 1968.
Java se často používá pro práci s regulárními výrazy: jejich podpora je součástí standardní knihovny java.util.regex.
Zjistili jsme, co jsou regulární výrazy v jazyce Java a jak pomáhají zpracovávat velká pole řetězcových dat.
Co jsou regulární výrazy
Pro jednoduché operace zpracování textových informací v jazyce Java můžete použít masky názvů souborů. Tímto způsobem lze snadno zkopírovat všechny soubory začínající písmenem R.
Regulární výrazy představují pokročilejší způsob vyhledávání shod nebo chyb v textu. Jedná se o sadu znaků (vzor), která hledá shodu v souboru. Často se používají ke zpracování nebo úpravám textu a také k vytváření skriptů pro kontrolu platnosti. Například pro kontrolu, zda zadané heslo splňuje podmínky služby.
Třídy knihovny regulárních výrazů
Balík java.util.regex se skládá ze sady tříd, které se používají k porovnávání posloupností znaků se vzory zadanými výrazy.
Existují tři základní třídy:
- Pattern – sadu příkazů a přístupový bod k rozhraní API regulárních výrazů v jazyce Java.
- Matcher – třída, která porovnává výsledky dekódování třídy Pattern se zbytkem programu.
Hlavní metody nástroje Matcher:
1. boolean matches vrací true, pokud řetězec odpovídá vzoru (Pattern);
2. boolean find vrací true, pokud v řetězci existuje podřetězec, který odpovídá vzoru;
3. String group vrací podřetězec, který odpovídá vzoru po volání metody find;
4. string replaceAll(String str) změní všechny řetězce, které odpovídají vzoru, a vrátí výsledek se změnami.
- PatternSyntaxException se vyhodí v případě výjimek (syntaktických chyb).
Třída Pattern slouží k zadání regulárního výrazu a nástroj Matcher vyhledává posloupnosti znaků v kódu.
Syntaxe regulárních výrazů jazyka Java
Regulární výrazy se zapisují pomocí regulárních znaků, znakových sad a skupinových znaků.
Nejjednodušší je vyhledávat běžné textové znaky. Znaky, které stojí samy za sebe, se nazývají literály. Pokud například v šabloně zadáte slovo dog, budou se hledat všechny případy v řetězci, kdy slova začínají těmito znaky. Ve výsledcích vyhledávání se objeví například slova dog a doghunter.
Hranaté závorky a kroužkové (^) nezobrazují znak, ale příkaz. Takové znaky se nazývají metaznaky nebo speciální znaky. Pokud znak ^ umístíte do hranatých závorek ([^dog] ), bude matcher hledat všechny znaky kromě kombinace písmen dog.
Metaznaky pro vyhledávání shod a hranic řetězců
- ^ – začátek řetězce;
- $ – konec řetězce;
- - – zadejte jeden znak, který by neměl být v závorkách;
- \b – konec slova;
- \B – ne konec slova;
- \A – začátek vstupu;
- \Z – konec vstupu.
Třídy symbolů
Regulární výrazy umožňují pracovat s třídami znaků. Například:
- \d – libovolný číselný znak;
- \D – jakýkoli nedigitální znak;
- \s – znak mezery;
- \S – znak mezery;
- . – zadejte jeden libovolný znak;
- \w – alfanumerický znak;
- \W – jakýkoli znak kromě alfanumerického.
Rozsah znaků můžete nastavit pomocí znaku -. Regulární výraz (az) pak vyhledá všechny znaky v daném rozsahu.
Některé příkazy začínají zpětným lomítkem \. To znamená, že další znak se použije jako zástupný znak. Například kombinace lomítka a znaku n - \n - znamená řádkový posuv.
Někdy je potřeba znaky escape, tj. zobrazit znaky, které program obvykle vnímá jako systémové znaky. Znaménko + tedy znamená výskyt dalšího znaku jedenkrát nebo vícekrát. Chcete-li na obrazovce zobrazit samotné plus, musíte použít dvě lomítka: \\+, protože jedno lomítko \ je také speciální znak.
Kvantifikátory a jejich způsoby fungování
Regulární výrazy mají omezovače, které určují četnost výskytu znaku nebo skupiny znaků. Takové omezovače se nazývají kvantifikátory. Píšou se za znak nebo skupinu znaků.
Hlavní kvantifikátory jsou:
- ? – znak se objeví nultý nebo jedenkrát;
- * – nula nebo vícekrát;
- + – jeden nebo vícekrát;
- {n} – n-krát;
- {n,} – n nebo vícekrát;
- {n,m} – ne méně než nkrát, ale ne více než mkrát.
Kvantifikátory pracují ve třech režimech: nenasytný, líný a příliš nenasytný. Ve výchozím nastavení pracují regulární výrazy v režimu nenasytný (greedy).
- V nenasytném režimu program hledá maximální shody podle délky řetězce.
- Nenasytný režim prohledává řetězec zleva doprava a naopak. Příliš nenasytný se nevrací.
- Rozdíl mezi příliš nenasytným režimem a nenasytným režimem je ve zpětném vyhledávání.
- Líný režim hledá nejkratší shodu, která splňuje všechny podmínky vzoru.
Jak používat regex v jazyce Java
Řekli jsme si, že regulární výrazy slouží k úpravě řetězců na základě vzorů. Můžete například automaticky nahradit rovné uvozovky "" úhlovými uvozovkami "", zkontrolovat správný pravopis slov nebo počet otevřených a uzavřených závorek.
Regulární výrazy se používají také pro ověřování. Například zkontrolovat, zda je IP adresa v desetinném tvaru, zda e-mailová adresa obsahuje symbol @ a název domény.
Znaky v regulárních výrazech se kombinují. Regex jazyka Java pro určení platnosti telefonního čísla vypadá takto:
^\\(?(\\d{3}\\)?[- ]?(\\d{3})[- ]?(\\d{4})$
Zde jsou uvedeny následující příkazy:
- Číslo může začínat nepovinným znakem " ( " ;
- Následují 3 číslice od 0 do 9;
- Řetězec může mít mezi číslicemi nepovinný znak " - ";
- Řetězec může obsahovat ještě jeden nepovinný znak " - ";
- Další rozsah 3 číslic od 0 do 9;
- Nepovinný znak " - "
- Další 4 číslice od 0 do 9.
Takové výrazy se obtížně interpretují, ale zjednodušují provádění programů a vyžadují psaní víceřádkového kódu s velkým počtem podmínek.
Pro zjednodušení práce existují statistické analyzátory regulárních výrazů.
Online analyzátor Regex101 pracuje s Javou. Podporuje osmou verzi jazyka a umí interpretovat regulární výrazy, testovat kód a používat knihovnu hotových řešení.
Autor: Mgr. Alexander Tartachny