1 / 12

Regul ární výrazy

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

zavad
Download Presentation

Regul ární výrazy

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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 !~

  2. 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"

  3. 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í/

  4. 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]

  5. 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/

  6. 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.

  7. 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";}

  8. 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;

  9. 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 # ;

  10. 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.

  11. 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

  12. 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/<>/"/;

More Related