Vladimír Benc napsal/wrote, On 07/19/07 08:16: >> spachal jsem jeden >> funkcni-"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" >> ale mel by jit elegantneji \([0-9]\{1,3\}\)\.\1\.\1\.\1 vyhleda 4x
Ne, to nepujde. Backreference se neodkazuje na "definici", ale na konkretni "napln". V tromto pripade tedy \1 neznamena '[0-9]\{1,3\}' ale v ramci vyhodnocovani zcela konkretniho retezce ty znaky, ktere matchnul uvedeny vyraz. Shora zapsany elegantnejsi tvar tak ve skutecnosti znamena "ctyri identicka jedno az trojciferna cisla oddelena teckami". A jeste jednu vadu oba dva zapisu maji - nejsou "ukotveny" na zacatek nebo konec neceho. Vyraz tak matchne napriklad i 2195.184.36.7368 >> 1-3 cislice a mezi nima tecka-teoreticky by mel byt spravne,ale >> nechodi-co mi unika? > > no me napadlo pro zjednoduseni pouze: > egrep '([0-9]{1,3}\.){3}[0-9]{1,3}' > > s tim backreference \1 to v grepu nebude asi moc slavne, spise to bude > fungovat v awk ci sed pri nahrazovani textu. s/(pat)tern/\1 a mat/ > pokud to funguje i v grepu tak se omlouvam Jak uz tady padlo, jde o regularni vyrazy, ktere by mely byt pro vsechny je pouzivajici programy stejne (minus neplanovane odchylky implementace). Backreference v GREPu funguji, ovsem, spravne pouzite - coz pro shora uvedene elegantni vylepseni neplatilo. Tedy - tam taky fungovaly, ale nedelaly to, co autor chtel. V kazdem pripade - nezapomente vyraz "ukotvit" - jestli je cislo na zacatku radky, tak '^' na zacatku vyrazu, jestli je predchazeno mezerou nebo tak necim tak take uvest. Obdobne pro druhy konec. "Volne plovouci" vyrazy celkem casto zbytecne chybuji tim, ze matchnou nekde jinde na radku neco jineho ... ---------------- A ted trochu akademictejsi cast, pro fandy - nemyslim, ze to podle toho bude nekdo skutecne implementovat: Jinak se ale lze na regularnim vyrazu znacne vyradit - zalezi jakou volnost ocekavas "na vstupu". Co se tyce formatu zapisu ciselnych IP adres, doporucuji 'man inet_ntoa' sekci 'INTERNET ADDRESSES' - zjistis, ze ciselna adresa nemusi byt nutne skupina ctyr cislic, ale taky jen tri, dvou nebo dokonce jedne. Korektne napsane programy s tim samozrejme pocitaji, ale script, pokud vis, ze na vstupu budou vzdy jen ctyrciselne adresy, samozrejme nemusi. Dale zalezi jak striktni kontrolu formatu pozadujes. Nejtrivialnejsi kontrola je samozrejme tady zminena [0-9]\{1,3\} ale kdybys chtel byt opravdu zcela presny (ta cisla mohou byt ne libovolna trojciferna, ale jen v rozsahu 0-255), tak by to bylo o dost horsi: 2[0-4][0-9]\|25[0-5]\|[01][0-9]\{2\}\|[0-9]\{1,2\} V obou pripadech jde samozrejme o popis jednoho cisla, cela IP adresa by pak byla \(N\.\)\{3\}N kde N je popis toho jednoho cisla. Chtel jsem pro pobaveni vytahnout i kompletni vyraz pro matchovani IP adresy ve vsech povolenych formatech (a.b.c.d|a.b.c|a.b|a), ale nemuzu to najit a psat to znovu nebudu - bylo to dobrych deset radku vyrazu ... Dan -- Dan Lukes SISAL MFF UK AKA: dan at obluda.cz, dan at freebsd.cz, dan at (kolej.)mff.cuni.cz -- FreeBSD mailing list (users-l@freebsd.cz) http://www.freebsd.cz/listserv/listinfo/users-l