Přednáška #4: Regulární výrazy (perlrequick, perlretut, perlre) ############################## Uvozovkovací operátory (perlop) ====================== '' q{} <-- neinterpolující "" qq{} <-- interpolující `` qx{} qx'' <-- výstup příkazu (verze s '' neinterpoluje) qw{} <-- seznam slov <=0, >=1, 0/1 {m,n} {m} {m,} <-- explicitní počet opakování \X <-- invertuje, zda X je meta-znak Kategorie znaků =============== \s \S <-- whitespace (velkým písmenem negace) \d \D <-- decimální číslice \w \W <-- word (alfanumerické + podtržítko) [\s\d] <-- kategorie v množině [[:digit:]] <-- POSIXové množiny Magické proměnné (perlvar, English) ================ $& $MATCH <-- text matchnutý předchozím regexem (pozor, pomalé!) ${^MATCH} <-- rychlejší verze, která funguje jen s modifikátorem "/p" $+ <-- text matchnutý poslední úspěšnou závorkou např. m{a=(.*)|b=(.*)} @- @+ <-- offsety začátků a konců+1 matchů závorek $-[0] $+[0] popisuje celý match, $-[1] popisuje $1 atd. $+{NAME} <-- obsah pojmenované závorky (viz (?REGEX) níže) $-{NAME} <-- reference na pole obsahů všech matchů závorky ... všechny platí do konce bloku nebo do dalšího matchování Magické konstrukce ================== (?#text) <-- komentář (?i) (?-i) <-- zapne/vypne modifikátor(y) (?:REGEX) <-- nezachycující závorka (jen strukturální) (?i:REGEX) <-- kombinace (?|A|B|C) <-- větve mají společné číslování závorek (?REGEX) <-- pojmenovaná závorka Assertions ========== \A \z <-- začátek a konec stringu (ne řádku) \Z <-- konec stringu nebo newline na konci stringu (jako $ bez /m) \b \B <-- word boundary (začátek a konec stringu chápe jako \W) (?=REGEX) <-- positive look-ahead (?!REGEX) <-- negative look-ahead (?<=REGEX) <-- positive look-behind (musí mít pevnou délku) (?...)(?...)) <-- definice, která se nevykoná Příklad: ^(a(?1)b|)$ Příklad: ^( ( \( (?1) \) )* )$ Příklad: ^( ( \( (?1) \) | \[ (?1) \] )* )$ Žravost ======= 'aaaa' =~ /(a+)(a+)/ <-- $1='aaa', $2='a' =~ /(a+?)(a+?)/ <-- $1='a', $2='a' Přesná pravidla (v pořadí klesající priority): 1. Regex matchne na nejlevější možné pozici v řetězci. 2. V konstrukci (a|b|c) matchne nejlevější možná varianta. 3. První kvantifikátor matchne nejdelší možný podřetězec, pak druhý kvantifikátor atd. [pro nežravé: nejkratší možný] Řízení rekurze ============== (a++) <-- "posesivní" kvantifikátor, který se písmenek nevzdá (a++a tedy nematchne nikdy) (?>REGEX) <-- posesivní podvýraz (*PRUNE) <-- přes tento bod se nevracet (jako řez v Prologu) Postupné matchování =================== pos SCALAR <-- vrátí aktuální pozici pro daný skalár (lze modifikovat) m{REGEX}g <-- najde následující match (v seznamovém kontextu všechny) m{\G...}g <-- ukotví další match za konec předchozího Pragmata (re) ======== use re '/i'; <-- od nynějška jsou všechny regexy case-insensitive use re 'debug'; use re 'debugcolor'; Transliterace (perlop) ============= tr/SRC/DST/MOD <-- překlad znaků z množiny SRC na DST (třeba tr/A-Z/a-z/) modifikátory: c complement: neguje množinu SRC d delete: smaže nepřeložené znaky s squash: smaže opakované výskyty r return: vrátí nový string místo přepsání starého tr{SRC}{DST}mod, $a =~ tr/SRC/DST/ apod.