regulerni vyraz pro IP
Dan Lukes
dan at obluda.cz
Thu Jul 19 10:15:53 CEST 2007
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
More information about the Users-l
mailing list