Regulární výrazy v Javě | robot_dreams Czech w
should_authorize_via_email
email.input_code tel.input_code
 
email.code_actual_for tel.code_actual_for
apply_exit_text
session_ended
to_homepage
Regulární výrazy v Javě

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

Více článků
Příručka od robot_dreams s příkladem syntaxe
Kam se dnes posouvají technologické hranice robotiky?