ARCHIV |
|||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Perl (23) - Regulární výrazy - rozšířené vzoryRozšířené vzory jsou rozšířením tradiční syntaxe regulárních výrazů o nové konstrukce. Rozšířené vzoryJak již bylo řečeno, rozšířená syntaxe zavádí některé speciální konstrukce. Ač možná nevědomky, již jsme se s ní setkali. Jde například o zápis závorek tak, aby jejich obsah nebyl zapamatován. Syntaxe rozšířených vzorů vypadá obecně takto: (?znak ). Znak zde zastupuje nějaký symbol nebo symboly, které blíže určují, o jaký rozšířený vzor se jedná. Upozornění: Některé z rozšířených vzorů jsou zařazeny pouze experimentálně a není zaručeno, že budou dostupné i ve vyšších verzích Perlu. Proto použití těchto konstrukcí konzultujte s manuálem (man perlre). KomentářeDalším způsobem, jak dovnitř regulárního výrazu vložit komentář je použití syntaxe (?# ). Chová se stejně, jako klasické komentáře - je ignorován. Lze ho psát na libovolné místo v regulárním výrazu. Jediným omezením v komentáři je nemožnost použít uzavírací kulatou závorku. Většinou je přehlednější užít volnou syntaxi a přepínač x, nicméně rozšířený vzor tu je také.
print "MATCHED" if "12AFBB" =~ /^[a-fA-F0-9]+$(?#číslo v šestnáctkové soustavě)/; Lokální určení přepínačeLze nastavit, aby byl některý z přepínačů imsx aktivní jen pro určitou část vzoru. Následkem uvedení přepínače i se nerozlišují velká a malá písmena. To můžeme aplikovat na část vzoru:
print "MATCHED" if "abcdef" =~ /((?i)abc)def/; #vyhovuje Přepínač, kterému předřadíme znak -, je výslovně zakázán. Tímto způsobem lze globální přepínač naopak zrušit.
print "MATCHED" if "abcdef" =~ /((?-i)abc)def/i; #vyhovuje Aby nebyl obsah závorek zároveň uložen, lze použít zápis (?přepínač:řetězec), což je ekvivalentní s (?:(?přepínač)řetězec) Lokální přepínače umožňují ještě další věc. Co když v cyklu potřebujeme testovat výraz, u nějž předem nevíme, jestli bude záležet na velikosti? Určitě bychom našli nějaké okliky, jak toho docílit, ale nejlepší řešení povede právě přes lokální přepínače, které vztáhneme na celý regulární výraz.
foreach $vzor (qw(Praha (?i)linux)) { Pohled dopředu a dozaduPohled patří mezi další speciální vlastnosti. V určitém stadiu se testování řetězce může zastavit a lze porovnat část řetězce za nebo před aktuální pozicí. Pozice se přitom nemění. V konečném důsledku to znamená, že ten řetězec, který byl kontrolován z nějaké zadní nebo přední pozice, nebude součástí vyhovujícího podřetězce, přestože byl srovnáván. Změní mimo jiné věci jako návratová hodnota, hodnoty proměnných $n nebo proměnná $&. Syntaxe pohledu dopředu je (?= ) a pohledu dozadu (?<= ). Význam těchto konstrukcí je zřejmý i z jejich přesnějších názvů - vzor (?= ) se nazývá pozitivní look-ahead a (?<= ) je pozitivní look-behind.
$r = "mandrivalinux linux linuxsoft"; Obzvláště z 1. případu je patrné, co pohledy dopředu a dozadu dělají. Ve výsledném seznamu je jen řetězec "linux", přestože jsou ve skutečnosti kontrolovány i znaky před a po. Po odstranění pohledů bude tato kontrola zrušena. Pokud (?= ) resp. (?<= ) nahradíme za (?! ) (negativní look-ahead) resp. (?<! ) (negativní look-behind), je význam opačný. Řetězec vyhoví pouze jestliže vzor neuvidí vepředu resp. vzadu vzor, který jsme určili. Nakonec ještě poznamenejme, že ze zřejmých důvodů nelze v look-behind použít kvantifikátory, jež nevyjadřují konkrétní délku. Provedení kódu Perlu uvnitř regulárního výrazuKonstrukce (?{výraz}) slouží k vykonání perlového bloku kódu uvnitř vzoru, přičemž výsledek nijak neovlivňuje vzor. To lze použít v případě, kdy chceme už v regulárním výrazu přiřadit zapamatované hodnoty do proměnných.
$retezec = "Cena: 120USD"; Místo $1 by bylo pohodlnější ve vzoru použít speciální proměnnou $^N. Jejím obsahem je vždy posledně zapamatovaný řetězec. A pro úplnost zmíním ještě proměnnou $^R, která obsahuje návratovou hodnotu posledního bloku vloženého do regulárního výrazu. Provedení kódu Perlu uvnitř regulárního výrazu s dosazením do vzoruZápis (??{výraz}) má podobný význam jako ten předešlý. Liší se v tom, že výsledek po vyhodnocení výrazu je dosazen do vzoru.
$retezec = "Cena: 120USD"; Vypnutí backtrackinguBacktracking znamená posouvání pozice v porovnávaném řetězci zpět. To nastává při porovnávání pomocí hladového kvantifikátoru. Nejprve je vždy vlivem hladového kvantifikátoru spolknuta nejdelší možná část textu a poté se pozice posunuje zpět. Právě toto je backtracking.
print "MATCHED" if "cokoliv" =~ /.*liv/; #vyhovuje V prvním případě backtracking normálně funguje. Ve druhém je však vlivem hladového kvantifikátoru spolknut celý text až do konce, backtracking neprobíhá a vzor tedy nemůže uspět. PodmínkyA na závěr jsem si nechal řídící konstrukci. Je možné se až uvnitř regulárního výrazu rozhodnout, jak bude jeho další část vypadat. Podmínka má dva možné zápisy. Pro podmínku typu if-else to je (?(test)v_případě_true|v_případě_false) a pro samotné if jen (?(test)v_případě_true). Test je výrazem, který se vyhodnocuje na true nebo false. Podle vyhodnocení je aplikována příslušná část regulárního výrazu.
$prospel = 0; Pokud máte zájem o podrobnější informace o rozšířených vzorech, odkazuji na manuálovou stránku perlre a její oddíl Extended Patterns. Další escape znakyV předcházejících dílech jsme již pár escape znaků poznali, ale ještě mnohé další zbývají. Pojďme si představit alespoň některé z nich. Pomocí escape znaků lze tisknout všechny znaky ASCII tabulky. Libovolný znak se zapisuje buď osmičkově nebo šestnáckově. V 1. případě se píše příslušné trojmístné číslo za zpětné lomítko, u šestnáctkového zápisu je to dvojmístné číslo za \x.
print "Perl" =~ /\x50\x65\x72\x6C/; #šestnáctkový zápis Escape znaky lze použít ke změně velikosti písmen. Převedeme řetězec s náhodnou velikostí znaků na řetězec, který velkým písmenem pouze začíná (ostatní budou malá).
$retezec = "náhODná VElIkOSt"; Znak \u Převádí znak, který následuje, na velké písmeno. Podobně znak \l převede následující písmeno na malé. \L změmí skupinu znaků na malá písmena. Skupina začíná ihned za \L a končí uvedením znaku \E nebo koncem řetězce (v ukázce tedy není nezbytně nutný). Opět existuje alternativa v podobě \U pro převedení na velká písmena, která také končí znakem \E. Další možností escape znaků je potlačení metavýznamu části řetězce. Stačí ji jen ohraničit znaky \Q (začátek) a \E (konec). 1. případ nevyhoví, protože otazník má význam kvantifikátoru. \Q tento význam ruší.
print "MATCHED" if " ? " =~ /^ ? $/; Další věc nesouvisí ani tak s escape znaky, jako spíše s významem speciálních znaků. Vytvoříme vzor, kterému vyhoví jeden z těchto řetězců: "/root", "/home/xdf" nebo "/usr/local/apache2.2/xdf". V nich se vyskytuje řada lomítek, které ale mají v regulárních výrazech speciální význam. Proto jim všem musíme předřazovat zpětné lomítko.
/^((\/root)|(\/home\/xdf)|(\/usr\/local\/apache2\.2\/xdf))$/
Je to správné řešení, ale právě v těchto případech (typické právě pro adresářové cesty) je užitečné použít jiný uvozovací znak, který není ve výrazu použit. Připomínám, že je potom povinné i uvedení m před uvozujícím znakem.
m#^((/root)|(/home/xdf)|(/usr/local/apache2\.2/xdf))$#
Příště se už konečně podíváme na nějaké praktické užití regulárních výrazů.
Související články
Předchozí Celou kategorii (seriál) Další
Perl (1) - Dávka teorie na úvod
Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce Perl (5) - Podmínky Perl (6) - Pravdivostní výrazy Perl (7) - Vstup poprvé Perl (8) - Některé základní vestavěné funkce Perl (9) - Cykly Perl (10) - Další řídící struktury Perl (11) - Pole - úvod Perl (12) - Pole - základní operace Perl (13) - Hashe Perl (14) - Další nástroje pro seznamy Perl (15) - Výchozí proměnná, heredoc, symbolické odkazy Perl (16) - Regulární výrazy - začínáme Perl (17) - Regulární výrazy - kotvy Perl (18) - Regulární výrazy - množiny znaků Perl (19) - Regulární výrazy - opakování a kvantifikátory Perl (20) - Regulární výrazy - magické závorky Perl (21) - Regulární výrazy - nahrazování Perl (22) - Regulární výrazy - přepínače Perl (24) - Regulární výrazy - příklady Perl (25) - Regulární výrazy - závěr Perl (26) - Podprogramy Perl (27) - Prototypy Perl (28) - Rozsahy platnosti proměnných Perl (29) - Úvod k práci se soubory Perl (30) - Práce se soubory Perl (31) - Testování souborů Perl (32) - Jiné typy souborů Perl (33) - Formátování výstupu - printf Perl (34) - Formátování výstupu - formáty Perl (35) - Vestavěný debugger Perl (36) - Grafické debuggery Perl (37) - Začínáme s moduly Perl (38) - Rozhraní modulu Perl (39) - Pragma Perl (40) - Dodatky k modulům Perl (41) - CPAN Perl (42) - Argumenty příkazového řádku Perl (43) - Přepínače Perl (44) - Dlouhé přepínače Perl (45) - Odkazy Perl (46) - Užití odkazů a anonymní data Perl (47) - Složitější datové struktury Perl (48) - Libovolně složité datové struktury Perl (49) - Tabulky symbolů a typegloby Perl (50) - Uzávěry a iterátory Perl (51) - Signály Perl (52) - Externí příkazy Perl (53) - Režim nakažení Perl (54) - Fork Perl (55) - Eval Perl (56) - Volby příkazu perl Perl (57) - Jednořádkové skripty Perl (58) - OOP - úvod Perl (59) - OOP - typické použití Perl (60) - OOP - dědičnost Perl (61) - OOP - přínos a užití dědičnosti Perl (62) - OOP - přetěžování Perl (63) - OOP - závěr Perl (64) - Projekt - čtečka sportovních výsledků Perl (65) - Projekt - získání dat Perl (66) - Projekt - výběr zápasů a podrobnosti Perl (67) - Projekt - dokončujeme modul Perl (68) - Projekt - zobrazení zápasů Perl (69) - Projekt - online přenos Perl (70) - Plain Old Documentation Perl (71) - Navazování proměnných Perl (72) - Navazování složitějších datových typů Perl (73) - DBM Perl (74) - Sockety Perl (75) - Obsluha více klientů Perl (76) - Síťová hra v kostky Perl (77) - Služby internetu Perl (78) - Databáze - úvod Perl (79) - Databáze - manipulace s daty Perl (80) - Databáze - závěrečné poznámky Perl (81) - CGI - příprava webového serveru Perl (82) - CGI - první skripty Perl (83) - CGI - získávání dat od uživatele Perl (84) - CGI - usnadnění tvorby skriptů pomocí modulu CGI Perl (85) - CGI - generování dokumentu modulem CGI Perl (86) - CGI - cookies Perl (87) - CGI - příklad aplikace Perl (88) - CGI - závěr Perl (89) - Mason - snadné psaní webů Perl (90) - Mason - speciální bloky Perl (91) - Mason - handlery Perl (92) - Mason - závěr Perl (93) - Catalyst - MVC framework pro Perl Perl (94) - Catalyst - základy pro psaní aplikace Perl (95) - Catalyst - šablony Perl (96) - Catalyst - spolupráce s databází Perl (97) - Curses - tvorba textových uživatelských rozhraní Perl (98) - Curses - pozicování a okna Perl (99) - Curses - měření rychlosti psaní Perl (100) - Curses - použití hotových widgetů Perl (101) - Curses - jednoduchý textový editor Perl (102) - Rozšiřování Perlu pomocí XS Perl (103) - Rozšiřování Perlu pomocí SWIG Perl (104) - Testování rychlosti Perl (105) - Testování programových jednotek Perl (106) - Debugování pomocí komentářů Perl (107) - Moose - moderní objektový systém Perl (108) - Moose - základní vlastnosti Perl (109) - Moose - role Perl (110) - Moose - meta API Perl (111) - Pokročilá práce se seznamy Perl (112) - Práce s PDF Perl (113) - Práce s archivy Perl (114) - Tk - úvod Perl (115) - Tk - umísťování widgetů Perl (116) - Tk - základní widgety Perl (117) - Tk - některé pokročilejší widgety Perl (118) - Tk - čas a události Perl (119) - Tk - CD man Perl (120) - Wx - základní práce s widgety Perl (121) - Wx - události Perl (122) - Gtk2 - úvod Perl (123) - Gtk2 - základní práce s obrázky Perl (124) - Gtk2 - události a čas Perl (125) - Gtk2 - vlastní widgety Perl (126) - Gtk2 - textové okno a práce s pozicemi Perl (127) - Gtk2 - hierarchické seznamy Perl (128) - Gtk2 - dialogy Perl (129) - Gtk2 - skládání widgetů Perl (130) - Gtk2 - menu a toolbary Perl (131) - Gtk2 - transparentní okna, tray ikona, výběr souborů Perl (132) - Gtk2 - drag&drop, druid Perl (133) - Gtk2 - úpravy vzhledu aplikací pomocí rc Perl (134) - Gtk2 - Glade Interface Designer Perl (135) - XML - čtení a zápis Perl (136) - XML - DOM a SAX přístupy Perl (137) - Vlákna Perl (138) - Memoizace - cachování podprogramů Perl (139) - Profilling - efektivní odhalování pomalých míst v programu Perl (140) - Profilling - píšeme si vlastní profiler / debugger Perl (141) - Formátování kódu, deparsování, perltidy Perl (142) - Způsoby konfigurování Perl (143) - Struktura datových typů, správa paměti Perl (144) - POE - událostmi řízené programování Perl (145) - POE - aplikace typu klient-server Perl (146) - Perl 6 - jazyk budoucnosti Perl (147) - Perl 6 - regulární výrazy, nové operátory Perl (148) - Perl Culture Perl (149) - Závěr Pozvánka na Český Perl Workshop Perl 5.22.0 a vše okolo Perl 5.24.0 a vše okolo Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |