wut.xkcz.cz
7Led 2014

Vysvětlení 1313 - Regex golf

Dnes tu máme další programátorský comics.

Regex neboli regulární výrazy jsou výrazy, používané k filtrování textů za účelem zjištění, zda daný text obsahuje řetězec, vyhovující zadaným kritériím. Regulární výrazy jsou velice užitečné, ale současně ne vždy zcela snadno uchopitelné a formulovatelné. Mezi programátory se občas říká, že pokud má někdo nějaký problém a rozhodne se ho vyřešit regulárními výrazy, má najednou místo původního jednoho problému problémy dva (na což ostatně odkazuje i výrok v posledním panelu comicsu).

Protagonistka dnešního comicsu v prvním panelu oznamuje, že vytvořila hru, které říká Regex golf, spočívající v tom, že před sebou máte dva různé textové seznamy a vašim úkolem je vytvořit regulární výraz, kterému vyhoví všechny položky prvního seznamu, ale ani jedna ze seznamu druhého. Ilustruje to na příkladu regulárního výrazu, kterému vyhoví všechny podtituly filmů ze série Star Wars, ale žádný z podtitulů filmů ze série Star Trek - tedy "/m | [tn]|b/" (uvozovky nejsou součástí výrazu).

Pokud si tento regulární výraz rozebereme, dojdeme k tomuto: lomítko na začátku a na konci označuje pouze začátek a konec regulárního výrazu a jinak nemá žádný význam. Znak svislé čáry představuje v regulárních výrazech logický operátor OR (NEBO), což znamená, že k tomu, aby řetězec výrazu vyhověl stačí, aby splnil kteroukoliv z podmínek výrazu. První z nich je výskyt znaku M, následovaného mezerou. Této podmínce vyhovuje podtitul "The Phantom Menace" (snad pochopíte, že v překladu neoperujeme s českými distribučními názvy). V podtitulech Star Trek filmů se M nachází buď na začátku slova nebo uprostřed něj - čili ani v jednom z těchto případů za ním nenásleduje požadovaná mezera a tyto podtituly proto této podmínce nevyhoví.

Hranaté závorky, do kterých jsou uzavřeny znaky T a N ve druhé podmínce znamenají, že pro její splnění se může v řetězci vyskytovat kterýkoliv z těchto dvou znaků, ovšem protože je před hranatými závorkami ještě mezera, musí se i tento znak nacházet až za mezerou. Tuto podmínku splní podtituly "Attack of the Clones", "Revenge of the Sith", "A New Hope" i "Return of the Jedi" - v každém z těchto podtitulů se nachází buď T nebo N, kterému předchází mezera. Podtituly všech Star Trek filmů konče "The Undiscovered Country" sice obsahují na začátku určitý člen, který začíná písmenem T, ale protože jde o první znak celého podtitulu, chybí před ním požadovaná mezera a proto tyto podtituly druhé podmínce našeho regulárního výrazu nevyhoví.

A konečně třetí podmínka uvedeného regulárního výrazu požaduje, aby se kdekoliv v řetězci vyskytoval znak B. To splňuje pouze podtitul "The Empire Strikes Back" - žádný jiný z podtitulů Star Wars ani Star Trek filmů písmeno B neobsahuje.

Je třeba ještě dodat, že aby uvedený regulární výraz fungoval, nesmí být case sensitivní, tedy musí ignorovat, zda je dané písmeno velké či malé.

Ve druhém panelu hrdinka comicsu pokračuje ve svých experimentech s regulárními výrazy a oznamuje, že vytvořila program, který dokáže její Regex golf hrát sám a tedy vytvářet regulární výrazy na základě dvou náhodně zvolených textových seznamů tak, aby první seznam výrazu vyhověl a druhý ne. Její přítel či kolega začíná tušit, že se schyluje k problémům...

Ve třetím panelu se hrdinka přiznává k tomu, že ztratila zdrojový kód zmíněného řešícího programu, takže nyní "grepuje" (používá linuxový příkaz "grep", který slouží právě k vyhledávání a výpisu řetězců na základě regulárních výrazů) ve snaze najít cokoliv, co by připomínalo kód programu, sloužícího k řešení regulárních výrazů, respektive jejího Regex golfu.

V posledním panelu pak konstatuje, že by se celé její hledání dalo charakterizovat regulárním výrazem "/(meta-)*regex golf/" a naráží tedy na skutečnost, že (předpokládáme, že za bouřlivého povzbuzování od Xzibita) řeší problémy s regulárními výrazy pomocí regulárních výrazů, které hledá pomocí regulárních výrazů...

Její přítel na to poznamenává, že v takovém případě má nekonečně problémů (protože uvedenému regulárnímu výrazu vyhoví nekonečně metaúrovní regex golfu), čímž odkazuje na výrok, zmíněný v úvodu tohoto textu.

Mouseover text pak obsahuje řešení jednoho z možných zadání pro Regex golf - tedy regulární výraz, kterému vyhoví jména všech dosud zvolených amerických prezidentů, ale nevyhoví mu jména jejich volebních oponentů.

Doplněno 22:00 - Pokud byste si Regex golf chtěli zahrát, vězte, že skutečně existuje! Upozornil Josef Štěpánek.

Komentáře (0) Trackbacky (0)

Omlouváme se, formulář pro komentář je momentálně uzavřen.

Trackbacky jsou zakázány