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