abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 03:00 | Komunita

Na Humble Bundle lze získat počítačovou hru Company of Heroes 2 (Wikipedie, YouTube) běžící také v Linuxu zdarma. Speciální akce končí v sobotu v 19:00.

Ladislav Hagara | Komentářů: 0
dnes 02:00 | Zajímavý software

Christian Kellner představil na svém blogu projekt Bolt řešící bezpečnost rozhraní Thunderbolt 3 na Linuxu. Pomocí příkazu boltctl nebo rozšíření GNOME Shellu lze komunikovat s démonem boltd a například zakázat neznámá zařízení a předejít tak útokům typu Thunderstrike nebo DMA.

Ladislav Hagara | Komentářů: 1
dnes 01:00 | Nová verze

Po půl roce vývoje od vydání verze 11.0 byla vydána verze 11.1 svobodného softwaru pro vytváření datových úložišť na síti FreeNAS (Wikipedie). Nejnovější FreeNAS je postaven na FreeBSD 11.1. Přehled novinek v příspěvku na blogu. Zdůraznit lze zvýšení výkonu OpenZFS, počáteční podporu Dockeru nebo synchronizaci s cloudovými službami Amazon S3 (Simple Storage Services), Backblaze B2 Cloud, Google Cloud a Microsoft Azure

Ladislav Hagara | Komentářů: 0
včera 23:55 | Nová verze

Po dvou měsících vývoje od vydání verze 235 oznámil Lennart Poettering vydání verze 236 správce systému a služeb systemd (GitHub, NEWS).

Ladislav Hagara | Komentářů: 1
včera 20:00 | Nová verze Ladislav Hagara | Komentářů: 0
včera 19:33 | Pozvánky

Pražská Fedora 27 Release Party, oslava nedávného vydání Fedory 27, se uskuteční 19. prosince od 19:00 v prostorách společnosti Etnetera (Jankovcova 1037/49). Na programu budou přednášky o novinkách, diskuse, neřízený networking atd.

Ladislav Hagara | Komentářů: 0
včera 18:11 | Nová verze

Byla vydána verze 2.11.0 QEMU (Wikipedie). Přispělo 165 vývojářů. Provedeno bylo více než 2 000 commitů. Přehled úprav a nových vlastností v seznamu změn.

Ladislav Hagara | Komentářů: 0
včera 17:44 | Komunita

Canonical oznámil dostupnost kryptografických balíčků s certifikací FIPS 140-2 úrovně 1 pro Ubuntu 16.04 LTS pro předplatitele podpory Ubuntu Advantage Advanced. Certifikace FIPS (Federal Information Processing Standards) jsou vyžadovány (nejenom) vládními institucemi USA.

Ladislav Hagara | Komentářů: 3
včera 16:11 | Zajímavý software

Společnost Avast uvolnila zdrojové kódy svého dekompilátoru RetDec (Retargetable Decompiler) založeného na LLVM. Vyzkoušet lze RetDec jako webovou službu nebo plugin pro interaktivní disassembler IDA. Zdrojové kódy RetDec jsou k dispozici na GitHubu pod open source licencí MIT.

Ladislav Hagara | Komentářů: 3
13.12. 11:00 | Zajímavý software
Na Good Old Games je v rámci aktuálních zimních slev zdarma k dispozici remasterovaná verze klasické point&click adventury Grim Fandango, a to bez DRM a pro mainstreamové OS včetně GNU/Linuxu. Akce trvá do 14. prosince, 15:00 SEČ.
Fluttershy, yay! | Komentářů: 6
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (8%)
 (1%)
 (1%)
 (1%)
 (75%)
 (14%)
Celkem 992 hlasů
 Komentářů: 45, poslední 1.12. 19:00
    Rozcestník

    Regulární výrazy

    23. 1. 2008 | David Watzke | Programování | 47375×

    Regulární výraz (regular expression, dále jen regexp) slouží k vyhledání části řetězce, kterou předem (úplně) neznáme nebo která může mít více podob. Používá se v programovacích a skriptovacích jazycích.

    Obecné regulární výrazy

    Mezi obecné regexpy, které podporují všechny možné implementace (Bash, Perl, grep, GNU sed, GNU awk, glibc /regex.h/, atd.), patří množiny znaků. Ty reprezentují jeden znak a používají se pro označení části řetězce, která může mít různé podoby (různé znaky v určité části). Zapisují se mezi hranaté závorky.

    b[au]f  # Odpovídá řetězci baf nebo buf.
    
    [a-zA-Z]  # Množina rozsahu znaků. Odpovídá jednomu výskytu písmene
              # AZ (malá i velká písmena,
              # pouze bez diakritiky).
    
    [[:alpha:]]  # Totéž, ale zahrnuje i písmena s háčky a čárkami
                 # (pokud jsou nastavené české locales).
    [[:alnum:]]  # Jako předchozí, ale navíc zahrnuje číslice.
    
    [aeiouy]     # Množina malých písmen (a, e, i, o, u, y).
    
    [0-9]        # Množina všech číslic.
    [[:digit:]]  # Jiný zápis téhož.
    
    [123]   # Množina číslic 1, 2 a 3.
    
    [[:space:]]  # Množina "whitespace" znaků
    
    .       # Množina všech znaků. Odpovídá jednomu znaku.
    \.      # Odpovídá tečce.
    \\      # Odpovídá zpětnému lomítku.
    \*      # Odpovídá hvězdičce.
    

    Přidáte-li za výraz (např. množinu či znak) hvězdičku, změní se jeho význam. Místo jednoho výskytu se bude hledat libovolný počet výskytů; žádný až nekonečno. Například a* odpovídá libovolnému počtu písmen a za sebou. Výraz .* odpovídá úplně všem řetězcům.

    Množiny znaků lze přidáním ^ na začátek negovat tak, že znaky v nich obsažené se v daném řetězci nesmějí vyskytovat. Přidáte-li znak ^ jinam, než na začátek, stane se prostým znakem z množiny.

    Regexp vždy odpovídá své nejdelší možné variantě v řetězci (v Perlu toto chování lze ovlivnit, vizte níže), takže použijete-li například o odstavec výše zmíněný výraz .* a ihned za něj dáte například [0-9]* (libovolný počet číslic), tak si všimněte, že výraz .* využil své moci a označil vše, co jen mohl a na množinu [0-9]* nezbylo nic, místo toho aby se .* při prvním výskytu číslice zastavil, jak by se někdo mohl mylně domnívat. Zmiňuji se o tom zde proto, že tyto znegované množiny znaků jsou univerzálním řešením tohoto problému. Použijete-li místo původního výrazu .*[0-9]* výraz [^0-9]*[0-9]*, tak výraz [0-9]* označí celé první číslo, na které narazí, jelikož [^0-9]* se před číslicí zastaví. Pro lepší pochopení jsem níže (do části článku o GNU sedu) přidal dva ilustrující příkazy, ale nepředbíhejme. Následuje ukázka znegovaných množin znaků:

    [^0-9]        # Odpovídá jednomu znaku, který není číslice.
    [^[:digit:]]  # Jiný zápis téhož.
    

    Dále mezi obecné regexpy patří symboly začátku a konce řádku, které mají ovšem tento význam jen tehdy, jsou-li správně umístěny (začátek na začátku a konec na konci výrazu).

    ^       # Začátek řetězce.
    $       # Konec řetězce.
    

    Několik ukázek obecných regexpů:

    ^$        # Odpovídá prázdnému řetězci (začátek a hned konec).
    
    ^a.       # Odpovídá řetězci, který začíná písmenem 'a'
              # a je následován jedním libovolným znakem.
    
    ^[^0-9]*  # Odpovídá libovolnému počtu nečíselných znaků
              # od začátku řetězce
    
    b$        # Odpovídá řetězci, který končí písmenem 'b'.
    
    [0-9].[[:alpha:]]  # Odpovídá řetězci, který obsahuje číslici,
                       # poté libovolný znak a za ním písmeno.
    

    Rozšířené regulární výrazy

    Rozšířené (extended) regexpy značně rozšiřují možnosti těch obecných. Často je třeba je explicitně povolit. Bash je nepodporuje, Perl a GNU awk je používají běžně, grep potřebuje přepínač -E (příp. -P pro použití perlových regexpů; tento přepínač je dostupný, jen pokud byl grep zkompilován s podporou libpcre), GNU sed přepínač -r a při použití regex.h v C/C++ musíte předat funkci regcomp() flag REG_EXTENDED.

    Rozšířené jsou možnosti pro zachycení řetězce, ve kterém se určité části několikrát za sebou opakují. Tyto znaky se zapíší za určitou část regexpu.

    ?      # Volitelný výskyt (jeden nebo žádný).
    +      # Jeden a více výskytů.
    {n}    # Za n se dosadí požadovaný počet výskytů.
           # Toto nepodporuje GNU awk.
    {n,}   # Odpovídá n a více výskytům.
    {n,m}  # Odpovídá nm výskytům.
    

    Například:

    a?         # Jedno nebo žádné písmeno a.
    [ao]+      # Jeden nebo více výskytů písmen z množiny.
    [^ ]{3,5}  # Tři až pět znaků různých od mezery.
    [0-9]*     # Libovolný počet číslic.
    

    Kromě množin znaků jsou dostupné i množiny řetězců resp. výrazů, které se zapisují do kulatých závorek a oddělují pomocí znaku | (pipe).

    (str|pwd)    # Odpovídá řetězci str nebo pwd.
    (foo)+       # Jeden a více výskytů řetězce foo.
    (foo|bar)*   # Libovolný počet řetězců foo nebo bar.
    (gentoo){3,} # Odpovídá třem a více výskytům řetězce gentoo.
    ((li){2}e)?  # Volitelný výskyt řetězce lilie.
    

    Jak jsem naznačil, množina řetězců není úplně správný název, protože zrovna tak může jít o regexpy. Následující množina je složená ze dvou výrazů. Hned za množinou následuje otazník, který znamená, že výskyt všech výrazů z množiny je volitelný. První výraz značí jeden nebo více výskytů znaků a a b za sebou a druhý výraz odpovídá pěti libovolným číslicím.

    ([ab]+|[0-9]{5})?

    Pokud chcete regexp odpovídající například sudému počtu řetězců, lze použít toto:

    ^((linux){2})*$

    Vysvětlení: Máme regexp na označení dvou výskytů řetězce linux za sebou. Když se celý výraz obalí dalšími závorkami, hvězdička za ním zajistí označení též čtyř, šesti, osmi, deseti (atd.) výskytů. Pokud chcete minimálně dva výskyty, použijte místo hvězdičky plus.

    GNU sed

    Kromě toho, že sed podporuje nahrazování řetězců odpovídajících regexpům, má zajímavou vlastnost, a tou je podpora referencí. Když si regexpem vyberete určitou část řetězce a chcete ji použít i v nové (nahrazující) části, máte možnost použít příkazy podobné následujícím. Předávám sedu řetězec přes echo, abyste si to pro lepší představu mohli rovnou vyzkoušet.

    # Ukázka výše (u znegovaných množin) zmiňovaného problému.
    # Na výraz [0-9]+ zbude jen poslední číslo, tedy 1.
    echo retezec4241 | sed -r 's/.*([0-9]+)/\1/'
    # ... a ukázka řešení pomocí znegované množiny.
    # Výraz [^0-9]* se před první číslicí zastaví; vypíše se 4241.
    echo retezec4241 | sed -r 's/[^0-9]*([0-9]+)/\1/'
    
    # Výraz začínající číslicí bude vložen mezi hvězdičky.
    echo "nahodne cislo: 11.256 :-)" | sed -r 's/([0-9][^ ]+)/*\1*/'
    
    # Je možné použít i více referencí. Zkusme třeba označit
    # řetězec "lol" s libovolným počtem 'o' a za ním nějaké číslo.
    echo "nejdriv looool a pak cislo 123 ..." | \
    sed -r 's:.*(lo+l)[^0-9]+([0-9]+).*:\\1 je \1\n\\2 je \2:'
    

    Za reference jsou považovány pouze regexpy v kulatých závorkách, tedy množiny výrazů.

    Perl

    Perlové regexpy obsahují několik vlastních rozšíření. Jedním z nich jsou množiny.

    Perl standardní
    \d [[:digit:]]
    \D [^[:digit:]]
    \w [[:alnum:]]
    \W [^[:alnum:]]
    \s [[:space:]]
    \S [^[:space:]]

    Tyto zkrácené zápisy množin se používají úplně stejně jako ty běžné; \d+ – ekvivalent [0-9]+ či [[:digit:]]+, \s{3,} – tři a více whitespace nebo třeba \W* – libovolný počet znaků, které se nevyskytují v množině [[:alnum:]]. Pokud chcete, aby Perl do množin, jako je \w, zahrnoval i písmena s diakritikou, kromě českých locales je třeba v programu nastavit jejich použití:

    use locale;

    Perl poskytuje možnost kontroly nad tím, zda se bude označovat nejkratší nebo nejdelší možná varianta výrazu. Pokud chceme tu nejkratší, za daný výraz přidáme otazník; nejdelší je výchozí chování regexpů (nejen perlových).

    my($string) = "popokatepetl";
    
    # označí (a přiřadí do $1) celý řetězec
    $string =~ m/(p.*[oel])/;
    
    # označí řetězec "po"
    $string =~ m/(p.*?[oel])/;
    # totéž, tentokrát obecně
    $string =~ m/(p[^oel]*[oel])/;
    

    Toto zdaleka není vše, co Perl s regulárními výrazy umí – popsat vše by vydalo na dost dlouhý seriál. Jako zdroj dalších informací můžete použít například manuálovou stránku perlre(1).

    Regulární výrazy v praxi

    Asi neuškodí, když si ukážeme nějaké to využití regulárních výrazů v praxi.

    # Vypíše ze souboru (/etc/fstab) unixové cesty bez mezer.
    egrep -o '(/[^/ ]*)*' /etc/fstab
    
    # Vypíše názvy skupin v systému.
    egrep -o '^[^:]+' /etc/group
    sed 's/:.*//' /etc/group
    
    # Rozparsuje z unixové cesty adresář a soubor.
    echo /etc/fstab | sed -r 's:(.*)/(.*):adresář "\1", soubor "\2":'
    
    # Získá tagy z Ogg a přiřadí je do proměnných ($ALBUM, $ARTIST, $TITLE).
    eval $(ogginfo Floor-Fee-La.ogg | sed -r -e \
     '/^[[:space:]]+(TITLE|ARTIST|ALBUM)=/!d' -e 's:=:=":' -e 's:$:":')
    

    Šikovnou pomůckou je i stránka s ukázkami Užitečné jednořádkové skripty pro sed.

    Závěr

    Regexpy se jeví složitější, než ve skutečnosti jsou. Ovšem až na ty perlové, ty složité opravdu jsou :-). Po nějakém čase už píšete rozšířené regexpy bez velkého přemýšlení. Svoje zkušenosti můžete prověřit třeba interaktivními testy na lexmasterclass.com.

           

    Hodnocení: 97 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    23.1.2008 00:06 I
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Regularni vyrazy nejsou slozite, protoze slozite je to teprve bez nich =)
    23.1.2008 02:02 kafa | skóre: 10
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Přesně tak. Vždycky mě velmi pobaví, když někdo právě na regulárních výrazech demonstruje údajnou nečitelnost (a nepoužitelnost) Perlu. Já už bych nikdy nechtěl dělat kontrolu vstupů v jazyce, který neumožňuje regulární výrazy. Na tu dřinu se ještě pamatuju.
    David Watzke avatar 23.1.2008 14:06 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Souhlasím, přepisoval jsem slovnik.cz CLI do Perlu a díky chybějícímu switch/case (bude v Perl 6, btw.) jsem to vyřešil daleko snadněji pomocí regexpů.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    zoul avatar 23.1.2008 14:33 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Regulární výrazy
    BTW: given/when už je i v pětkové řadě Perlu.
    23.1.2008 14:38 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Regulární výrazy
    my $mode_map = {
      'show' => \ &do_show,
      'submit' => \ &do_submit,
    };
    
    $mode_map->{$mode}->(@param);
    
    uznávam, na given/when to nemá, obyčajný switch/case to zvládne v pohode.

    pre parsovanie textu si pozri \G a modifikátory cg

    Honza Balák avatar 23.1.2008 00:29 Honza Balák | skóre: 23 | blog: Jaxův linuxový zápisník | Předklášteří
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Výbornej článek. Jelikož ve tvorbě regexp trochu plavu (nebo spíš pro kontrolu), tak používám www.regexp.cz. Co se týká praktického použití, tak třeba nedávno místo abych se paplal s vytvářením výrazu na změnu názvů souborů, tak jsem raději použil KRename, ale stejně to bylo kontraproduktivní, protože tu změnu jsem z jistých důvodů musel dělat několikrát. Takže místo abych jen v historii našel příkaz a znovu spustil, tak jsem musel znovu projít cestu Next->Next v KRename.
    <null>
    23.1.2008 07:55 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Fajn odkaz, ale dostala se ti do neho chybicka :-) Spravne to ma byt www.regexp.cz

    Dejv
    Pevne verim, ze zkusenejsi uzivatele me s mymi napady usmerni a poslou tam, kam tyto napady patri...
    23.1.2008 00:29 petris
    Rozbalit Rozbalit vše Re: Regulární výrazy
    takže použijete-li například o odstavec výše zmíněný výraz .* a ihned za něj dáte například [0-9]* (libovolný počet číslic), tak si všimněte, že výraz .* využil své moci a označil vše, co jen mohl a na množinu [0-9]* zbyla už jen poslední číslice v řetězci
    Na [0-9]* nezbyde nic.
    Honza Balák avatar 23.1.2008 00:39 Honza Balák | skóre: 23 | blog: Jaxův linuxový zápisník | Předklášteří
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Taky mi to bylo divný, protože vím, že ing. Brandejs na přednáškách říkal, že hvězdička je maximálně žravá.
    <null>
    David Watzke avatar 23.1.2008 07:29 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Omlouvám se, moje chyba, hlavně že dole v ukázce u sedu mám potom [0-9]+.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    23.1.2008 08:25 Robert Krátký | skóre: 94 | blog: Robertův bloček
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Opraveno (máslo i na mojí hlavě - měl jsem si toho všimnout).
    Fluttershy, yay! avatar 23.1.2008 00:44 Fluttershy, yay! | skóre: 81 | blog:
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Danke schön.
    23.1.2008 00:48 petris
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Závorky a alternativa jsou i v nerozšířených regexpech, protože jinak by se tím nedal popsat regulární jazyk. Více třeba na wikipedii.
    23.1.2008 08:38 DarkCraft | skóre: 3 | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Celkem pekny clanek, ale zda se mi pomerne zbytecny, mame tu o tom cele weby, jak jiz nekdo zminil treba http://www.regexp.cz a pak take http://www.regularnivyrazy.info/ takze jak rikam.. Pekne, ale uz o tom bylo napsano moc.
    Podporuji ArchLinux;jabber conference: archlinux.cz@conference.jabber.org; http://darkcraft.org
    23.1.2008 09:11 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Regulární výrazy
    man perlre
    O'Reilly - Mastering Regular Expressions
    23.1.2008 09:23 miso | skóre: 36 | blog: iSCSI_initiator_howto | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Len taka drobnost: [a-zA-Z] != [:alpha:]
    myslim, ze je to armensky jazyk, kde pismeno "z" je cca v druhej tretine abecedy ;-)
    Project Satan infects Calculon with Werecar virus
    23.1.2008 10:02 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Regulární výrazy
    aj v slovenčine z nie je posledné písmeno abecedy :-)
    "správne" by malo byť [a-ž] :-D
    David Watzke avatar 23.1.2008 11:33 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Len taka drobnost: [a-zA-Z] != [:alpha:]
    Já jsem někde napsal, že je to totéž?
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    23.1.2008 12:16 miso | skóre: 36 | blog: iSCSI_initiator_howto | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Nie, moj prispevok je spomienka na jednu bugu ;-)
    Project Satan infects Calculon with Werecar virus
    23.1.2008 09:41 CET
    Rozbalit Rozbalit vše Re: Regulární výrazy
    [a-zA-Z]  # Množina rozsahu znaků. Odpovídá jednomu a více
              # výskytům písmen A až Z (malá i velká písmena,
              # pouze bez diakritiky).
    
    Jenom drobnost - tenhle zapis odpovida prave jednomu znaku z mnoziny A-Z nebo a-z. Kdyby to bylo jeden a vic, tak za tim musi byt "+".
    David Watzke avatar 23.1.2008 11:35 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Hmm, zase chybka... Tak to nevím na co jsem v tu chvíli myslel.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    geon avatar 23.1.2008 10:18 geon | skóre: 18 | blog: bavaria
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Mě se velmi líbí grafické zpracování regulárních výrazů. Je to starší, pro Python, ale přeci.

    regex_characters.png

    regex_characters.png
    mj41 avatar 23.1.2008 11:13 mj41 | skóre: 17 | blog: mj41 | Třinec a Brno
    Rozbalit Rozbalit vše Perlové jsou především nejmocnější
    Složitější? Ja bych to napsal, tak že ty Perlové uměly vždycky nejvíce a byly nejrychlejší.

    Jinak jak budou regulární výraze resp. gramatiky vypadat v Perlu 6 najdete v Synopses 5. Bude to zase o kousek dál.

    Např. samotná gramatika Perlu 6, resp. základ parseru v implementaci Rakudo (implementace Perlu 6 pro virtuální stroj Parrot), na které se začalo pracovat poměrně nedávno, vypadá takto.

    To k čemu by se měla každá z implementací dopracovat je v Larryho zatím nedokončeném (nefungujícím) návrhu STD gramatiky. Ale to už jsme se dostal k té nejsložitější věci co jsem kdy viděl a samozřejmě ještě nepochopil :-).
    David Watzke avatar 23.1.2008 14:03 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    Složitější? Ja bych to napsal, tak že ty Perlové uměly vždycky nejvíce
    No právě :-) Dokonce si člověk může napsat vlastní RE engine.
    Ale to už jsme se dostal k té nejsložitější věci co jsem kdy viděl a samozřejmě ještě nepochopil :-).
    Ano, přesně o tom mluvím :-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    thingie avatar 23.1.2008 16:36 thingie | skóre: 8
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    Regulární výrazy jako skutečné regulární výrazy, budou-li regulárními výrazy, tak přece nemůžou umět víc nebo míň, musí umět všechny stejně.
    Růžové lži.
    zoul avatar 23.1.2008 17:01 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    „Regulární výrazy“ v Perlu a většině ostatních jazyků nebo knihoven nejsou klasické regulární výrazy v informatickém slova smyslu – viz například (.*)\1 (WikiWiki, MoinMoin apod.), což podle Wikipedie není ani bezkontextové, natož regulární. I v rámci třídy regulárních výrazů ale můžou být některé věci navíc – viz například pojmenované závorky (named captures) v novém pětkovém Perlu.
    thingie avatar 23.1.2008 17:09 thingie | skóre: 8
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    No, to opravdu není ani bezkontextové, no. Ale to je pak trochu zvrhlý bavit se o regulárním výrazu, když nám na to nestačí ani zásobníkovej automat. (Byť třeba tuhle speciální věc je asi snadný implementovat.)
    Růžové lži.
    zoul avatar 23.1.2008 17:18 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    Jasně, ale to názvosloví už je zažité a těžko po někom chtít, aby dodržoval přesné definice z teorie automatů. Větší problémy z toho stejně nekoukají – pokud někdo automatům a gramatikám rozumí, rychle si všimne, že si ty definice tak docela neodpovídají.
    thingie avatar 23.1.2008 17:34 thingie | skóre: 8
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    No mně by hlavně nenapadlo, že na něco takovýho můžu poštvat nějaké regulární výrazy. Takže je možná hezký, že to umí víc, ale jak to mam vědět :-)
    Růžové lži.
    zoul avatar 23.1.2008 17:38 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Perlové jsou především nejmocnější
    To je fakt. man perlre každý den dvakrát před spaním :)
    23.1.2008 11:22 depka
    Rozbalit Rozbalit vše Re: Regulární výrazy
    (str|pwd) # Odpovídá řetězci str nebo pwd.

    nemelo by to byt radej: (str)|(pwd) ?
    David Watzke avatar 23.1.2008 11:36 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Ani ne.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    zoul avatar 23.1.2008 12:39 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Viz man perlre:
    The first alternative includes everything from the last pattern delimiter (“(”, “[”, or the beginning of the pattern) up to the first “|”, and the last alternative contains everything from the last “|” to the next pattern delimiter. That’s why it’s common practice to include alternatives in parentheses: to minimize confusion about where they start and end.
    23.1.2008 13:30 b*d | blog: b_d
    Rozbalit Rozbalit vše Re: Regulární výrazy
    nevite ja dostat perlre do vim?
    23.1.2008 14:05 Ondrej Skutka | skóre: 1
    Rozbalit Rozbalit vše Re: Regulární výrazy

    Nevím, jestli je to perlre, ale můžete zkusit použít \v ve vyhledávaném řetězci. Více viz :help magic

    23.1.2008 16:35 I
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Vzdyt je to prece PCRE (Perl Compatible Regular Expressions) a Vim samozrejme podporu ma, vizte tip #393 http://www.vim.org/tips/tip.php?tip_id=393
    spenat28 avatar 23.1.2008 21:41 spenat28 | Loc: 53.422224, -1.967178
    Rozbalit Rozbalit vše doplnil bych do článku
    Velmi užitečné [[:<:]]slovo[[:>:]]. Skoro nikde to není napsané ač o regulárních výrazech už vyšlo článků ...
    [spenat28][Štěpán_Mácha]
    David Watzke avatar 23.1.2008 21:52 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: doplnil bych do článku
    Co to dělá? Není to standardní regulární výraz, jelikož poslední egrep říká Nepřípustný název třídy znaků. Perlová specialita?
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    24.1.2008 00:29 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: doplnil bych do článku
    Hranice slov se často užijí třeba ve vim ve formě \<slovo\>.
    24.1.2008 00:30 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: doplnil bych do článku
    Neboli když hledá člověk proměnnou i, tak lépe /\<i\> než /i. Pokud tedy zrovna nepoužije * # nebo gd a podobné.
    24.1.2008 01:04 Semo | skóre: 44 | blog: Semo
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Rozšířené regulární výrazy

    ...Bash je nepodporuje
    man bash: An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly.

    Zatvorky {,} zvladaju aj basic regexpy, len sa musia escapovat pomocou \, inak su to obycajne znaky. V extended regexp presne naopak. Uplne rovnako je to aj s (, ), ? a +. Vsetky su zvladane aj v BRE ak su escapovane.

    Vsetko je popisovane spravanie grepu a sedu a grep -E a sed -r.
    If you hold a Unix shell up to your ear, you can you hear the C.
    25.1.2008 12:24 Daniel Novotny | skóre: 3
    Rozbalit Rozbalit vše Re: Regulární výrazy - echo /etc/fstab
    místo "echo /etc/fstab" v posledním příkladu má pravděpodobně být "cat /etc/fstab", ne?
    David Watzke avatar 25.1.2008 13:58 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy - echo /etc/fstab
    Ne, takovou věc bych nikdy nenapsal :-) Ale někdo se toho koukám chytnul a změnil to...
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    25.1.2008 14:02 Daniel Novotny | skóre: 3
    Rozbalit Rozbalit vše Re: Regulární výrazy - echo /etc/fstab
    jo, pravda... neuvědomil jsem si kontext, pardon
    25.1.2008 18:56 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Trochu zákeřné:
    bash$ sed -n -e "s/^\([A-Z]\)$/\1/p" <<<a
    a
    
    obzvlášť ve formě
    bash$ sed -n -e "s/^.*\([A-Z]\).*$/\1/p" <<<Aa
    a
    versus
    bash$ sed -r -n -e "s/^.*([[:upper:]]).*$/\1/p" <<<Aa
    A
    
    Jinak bash umí i extended regexp.
    
    bash$ [[ a =~ ^[A-Z]$ ]] && echo matches
    matches
    
    bash$ [[ a =~ ^[[:lower:]]$ ]] && echo matches
    matches
    
    bash$ [[ a =~ ^[[:upper:]]$ ]] && echo matches
    
    
    
    David Watzke avatar 25.1.2008 19:05 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Hmm, tak ten bash jsem si měl nejdřív zkusit, to jsem netušil...
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    25.1.2008 20:12 jakub
    Rozbalit Rozbalit vše Re: Regulární výrazy
    Aky regexp mam pouzit v sede, ak chcem trebars v retazci retezec4214 nahradit vsetky znaky e znakom y?

    $ echo "retezec4214" | sed -r 's/e/y/' nahradi len prvy vyskyt a skonci

    dakujem
    David Watzke avatar 25.1.2008 20:14 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Regulární výrazy
    (Všimni si toho g na konci.)
    echo "retezec4214" | sed 's/e/y/g'
    Toto není regulární výraz, mimochodem.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    25.1.2008 21:07 jakub
    Rozbalit Rozbalit vše Re: Regulární výrazy
    jasne, islo mi len o to g na konci...

    ja myslim, ze 'e' je regularny vyraz, sice primitivny, ale je to slovo regularneho jazyka :-)

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.