120 likes | 279 Views
Regul ární výrazy. Regular expressions = RegExp Vzory na porovnávání. Př. - vyhledání, zda se ve větě vyskytuje určité slovo. Operátor porovnání =~ Nejjednodušší regexp - znak nebo řetězec znaků $veta =~ /$slovo/ výsledek je 1, když se $slovo vyskytuje ve $veta, v opa čném případě undef
E N D
Regulární výrazy • Regular expressions = RegExp • Vzory na porovnávání Př. - vyhledání, zda se ve větě vyskytuje určité slovo • Operátor porovnání =~ • Nejjednodušší regexp - znak nebo řetězec znaků • $veta =~ /$slovo/ • výsledek je 1, když se $slovo vyskytuje ve $veta, v opačném případě undef • Opačný význam má operátor !~
Speciální znaky - metacharacters • . * ? + [ ] ( ) { } ^ $ | \ • Před ně se musí dát zpětné lomítko • Př. /\*/ - vyhovuje hvězdičce * • Proč? Protože mají speciální význam uvnitř regulárních výrazů. • Vypnutí speciálních významů: od \Q do \E • $q = "4+7+6"; • if($q =~ /4+7+6/) {print "1.shoda\n";} • if($q =~ /\Q4+7+6\E/) {print "2.shoda\n";} # vyhovuje výrazu tak, jak je • Jinak by se to muselo zapsat $p = "4\+7\+6"
Alternativy • Operátor | - nízká priorita, aby šlo psát: • /exit|quit|konec|leave/ • Jinak je třeba závorkovat: • /(m|p)at/ • [seznam] vyhovuje jednomu znaku ze seznamu, který je uvnitř závorek - použití pro velká/malá písmena • Lze zapsat i jako rozsah, např. [0-5], [A-P] • [^seznam] vyhovuje libovolnému jednomu znaku kromě těch, které jsou uvnitř závorek /st[oa]letí/
Zkratky • . (tečka) libovolný znak \d (digit) číslice [0-9] \D nečíslice[^0-9] \w (word char) alfanum. znak [a-zA-Z0-9_] \W nealfanum. znak [^a-zA-Z0-9_] \s (space) prázdný znak[ \t\n\r] \S neprázdný znak[^ \t\n\r]
Opakování {i,j} aspoň i a nejvýš j výskytů {i} právě i výskytů {,j} {0,j} tj. nejvýše j výskytů {i,} aspoň i výskytů * {0,} tj. libovolný počet výskytů + {1,} tj. aspoň jeden výskyt ? {0,1} tj. nejvýš jeden výskyt /černý\s.+\sbílý/ /černý\s\w+\sbílý/ /-?\d{3}/ /když|kdyby(ch|chom|s|ste)( \w+){2,}, tak/ /když|kdyby.*( \w+){2,}, tak/
Hladovost reg. výrazů • $veta = "Dnes máme krásné slunečné počasí."; • / .+ /čemu vyhovuje tento regexp? • Vyhodnocování reg. výrazů • Vypnutí hladovosti - ? • / .+? / Př. Najděte úsek textu uzavřený v závorce.
Ukotvení • Stanovení, ne jen co se hledá, ale i kde se hledá. • Speciální ukotvující znaky ^ začátek řetězce $ konec řetězce, ale ignoruje \n . \b na hranici slova (mezi \w a \W)(boundary) \B mimo hranici slova Př. Kontrola prázdných znaků na začátku a konci řádku. if($radek =~ /^\s+/) { print "Řádek začíná aspoň jedním prázdným znakem.\n";} if($radek =~ /\s+$/) { print "Řádek končí aspoň jedním prázdným znakem.\n";}
Nahrazování reg. výrazů • Operátor s/// (substitute) • V proměnné $prom se první výskyt řetězce, který vyhovuje vzoru, nahradí řetězcem • vzor = regulární výraz $prom =~ s/Pep/Honz/; • Volby: • g .. vyhledat a nahradit všechny výskyty vzoru • i .. nerozlišovat velikost písmen u vzoru • x .. uvolněná syntax $prom =~ s/vzor/nahrazující řetězec/volby;
Uvolněná syntax reg. výrazů • Pro přehlednější zápis složitých reg. výrazů /^s*([-+]?\d+\s*)*$/ přehledněji: /^\s* # libovolný počet prázdných znaků na začátku ([-+]?\d+ # celé číslo \s* # případné další prázdné znaky )*$ # libovolněkrát opakovat před koncem řetězce /x# zpracovat regexp se zřetelem na uvolň. syntax • Místo /vzor/ lze psát m{vzor} nebo jiný oddělovač • třeba # ;
Zpětný odkaz (back reference) • Co je v závorce, uloží se při shodě do speciální proměnné, na kterou se odkazuje pomocí \N, kde N je pořadí levé závorky v reg. výrazu Co vyhovuje těmto reg. výrazům? /^[^aeiouy]*([aeiouy])[^aeiouy]+\1[^aeiouy]?$/ /([^aeiouy])([aeiouy]).*\1\2.*/ • To, co vyhovovalo reg. výrazu v závorce, se nadále uchovává ve spec. proměnných $1, $2, ... • S těmito proměnnými lze pracovat i ve zbytku programu.
Zpětný odkaz (back reference) • Co je v závorce, uloží se při shodě prvku seznamu (pole) $retezec = "Novák\tNováková"; ($on,$ona) = ($retezec =~ /(\w+)\s+(\w+)/); print "$on a $ona\n“; • To, co vyhovovalo reg. výrazu v závorce, se uloží • doproměnných v závorce • i do proměnných $1 a $2
Operátor tr/// • Nesouvisí s regulárními výrazy. • Hromadné nahrazování znaků tr/a-z/A-Z/ # převede malá písmena na velká • Každý znak z první části se nahradí příslušným znakem ze druhé části – podle pořadí • Počet znaků v první části by měl být stejný jako počet znaků ve druhé části • když není, chová se to rozumně podle očekávání Nahradit podivné uvozovky (> ... <) v textu normálními: $text =~ tr/<>/"/;