Regulární výrazy II Práce s daty, 2. března 2023 Tři části regulárního výrazu 1. Vyhledávací (přiřazovací) maska 2. Substituční (nahrazovací) předpis 3. Modifikátory regulárního výrazu Jednořádkový zápis: /maska/substituce/modifikátory Např. obalení slov uvozovkami: /[a-z]+/"$&"/gmi Modifikátory regulárního výrazu Modifikátor = písmeno na konci RE (za zvoleným oddělovačem): • g = global – hledá všechny shody v zadaném textu • m = multiline – ^ a $ označují začátek a konec každého řádku • s = singleline (dotall) – metaznak tečka vyhovuje i konci řádku • i = insensitive – nerozlišuje se velikost písmen • U = ungreedy (lazy) – líný způsob vyhledávání v textu • u = unicode – podpora národních abeced Modifikátory lze kombinovat, např. /gmiU Líný versus lačný způsob vyhledávání Text: tučně normálně tučně RE: .*<\/b> Greedy (lačný, nenasytný) – as much as possible • Hledá co nejdelší řetězec vyhovující zadání --> vyhoví celý řetězec Lazy (líný, pohodlný) – as much as needed • Hledá co nejkratší řetězec --> vyhoví jenom tučně • Líný může být i jenom kvantifikátor: a+?, a*?, a{3,8}? Unicode rozšíření v regulárních výrazech Přidává třídu metaznaků \p{…} • \p{L} - písmena: Ll - malá, Lu - velká, Lo -- ostatní, … • \p{N} - čísla: Nd - desítková, Nl - písmenková (Ⅷ), No - ostatní (¼), … • \p{S} - symboly: Sc - měny (€, ¥), Sm - matematické, So - ostatní, … • a dále interpunkce, oddělovače, kontrolní znaky, … V závislosti na použitém nástroji může být rozšířen význam \w Více informací např. na https://javascript.info/regexp-unicode Substituce Nalezená shoda bude nahrazena uvedeným předpisem: • /Ing/Mgr/ – titul Ing. bude nahrazen titulem Mgr. • /Bc\. ?// – titul Bc. bude smazán (tj. předpis může být prázdný) V substituci se lze odkazovat na nalezenou shodu či skupinu: • /(Ing|Mgr)/Dipl. $1/ – Ing. → Dipl. Ing. a Mgr. → Dipl. Mgr. • /(.*)\t(.*)/$2\t$1/ – prohození pořadí hodnot • Starší způsob odkazování používá zpětné lomítko, např. \1, \2, … • Tímto způsobem se lze odkazovat i v rámci vyhledávací části RE! Cvičení I • Zapište RE, které budou validovat 1. Jméno a příjmení včetně diakritiky 2. Dvakrát to stejné slovo za sebou • Zapište RE včetně substituce, který… 1. Vymaže značky z HTML dokumentu • A) všechny, B) jen ty bez dalších vnořených značek 2. Přeformátuje datum z tvaru 20230302 • A) do podoby 02. 03. 2023 B) do podoby 2. 3. 2023 Cvičení I – řešení • Jméno a příjmení s diakritikou – \p{Lu}\p{Ll}+ \p{Lu}\p{Ll}+ • Stejné slovo dvakrát za sebou – \s(.+)\s+\1 • Výmaz všech značek HTML – <(.+)>/$2/gmU • Výmaz značek bez dalších vnořených značek • <(.+)>(.*)<\/\1>/$2/gmU • Přeformátované datum • S nulami – ^(\d{4})(\d{2})(\d{2})$/$3. $2. $1/gm • Bez nul – ^(\d{4})(0(\d)|(1[0-2]))(0(\d)|([1-3]\d))$ /$6$7. $3$4. $1/gm Konstrukce RE začínající znaky (? Pomocí vnořených částí RE ve tvaru (? … ) se tvoří • Vnořené modifikátory • (?isx-m)– lze je zapínat a vypínat v průběhu RE • Rozhlédnutí – lookarounds • (?= … ) – lookahead (koukáme dopředu); (?! … ) – negace podmínky • (?<= … ) – lookbehind (koukáme zpět); (?