Forum » Programiranje » Regularni izrazi
Regularni izrazi
scarymovie ::
Iz naslednjih vrstic:
192.48.124.81
84.125.89.0
100.0.0.1
100.0.1
želim narediti regularni izraz, ki bo ustrezal vsem vrstica.
Regularni izraz sem napisal tako:
([0-9])([0-9])([0-9])?(.[0-9])([0-9])?([0-9])?(.[0-9])([0-9])?([0-9])?(.([0-9])?([0-9])?)?
Zanima me, če sem ga prav napisal in kako bi se iz tega dal narediti deterministični končni avtomat?
hvala,
LP
192.48.124.81
84.125.89.0
100.0.0.1
100.0.1
želim narediti regularni izraz, ki bo ustrezal vsem vrstica.
Regularni izraz sem napisal tako:
([0-9])([0-9])([0-9])?(.[0-9])([0-9])?([0-9])?(.[0-9])([0-9])?([0-9])?(.([0-9])?([0-9])?)?
Zanima me, če sem ga prav napisal in kako bi se iz tega dal narediti deterministični končni avtomat?
hvala,
LP
- spremenilo: scarymovie ()
hatchette ::
Če imaš problem, ki ga rešiš z regexp-om, imaš potem dva problema.
Kater programski jezik? Tole se da gotovo rešiti precej lepše.
Kater programski jezik? Tole se da gotovo rešiti precej lepše.
scarymovie ::
To rabim pri leksikalni analizi, ni specifičnega jezika, važno je da oblikujem regularni izraz in nato iz tega izraza naredim deterministični končni avtomat.
arjan_t ::
Regularni izraz lahko poenostaviš na nekaj takšnega (za tvoje primere):
([0-9][0-9]?[0-9]?\.){2.3}([0-9][0-9]?[0-9]?)
fsm pa je itak čisto enostaven (leksikalna analiza):
start -> int
int -> int
int -> pika
pika -> int
int -> end
([0-9][0-9]?[0-9]?\.){2.3}([0-9][0-9]?[0-9]?)
fsm pa je itak čisto enostaven (leksikalna analiza):
start -> int
int -> int
int -> pika
pika -> int
int -> end
milc ::
Če naj tvoj RI sprejema natanko te vhode:
192.48.124.81
84.125.89.0
100.0.0.1
100.0.1
potem si ga zapisal narobe, ker na prvem mestu je vedno 1 ali 8 in in ne 0-9 kot sledi iz tvojega RIja:
([0-9])([0-9])([0-9])?(.[0-9])([0-9])?([0-9])?(.[0-9])([0-9])?([0-9])?(.([0-9])?([0-9])?)?
Če pa so tole primeri in so pravila, da imaš v resnici 4 ali pa 3 števila ločena s pikami, potem je druga zgodba, sam tega ne poveš v svojem postu. Tudi ne poveš, če se procesira samo znak po znak...
V perlu to z regexp sprejemaš takole:
NKA pa narediš tako, kot ste se to učili v šoli... sam sem že pozabu... zapiske mam pa 6000 milj daleč :)
Je pa to ena najbolj uporabnih snovi iz celega FRI faksa po mojem mnenju, in ti miljonkrat pride prav (predvsem ta del kako naredit RI), seveda, če bo tvoja kariera zašla v smer programiranja ali testiranja. Večina ljudi RIjev nikoli ne dojame, tudi tisti primerki, ki smo bili na FRIju.
192.48.124.81
84.125.89.0
100.0.0.1
100.0.1
potem si ga zapisal narobe, ker na prvem mestu je vedno 1 ali 8 in in ne 0-9 kot sledi iz tvojega RIja:
([0-9])([0-9])([0-9])?(.[0-9])([0-9])?([0-9])?(.[0-9])([0-9])?([0-9])?(.([0-9])?([0-9])?)?
Če pa so tole primeri in so pravila, da imaš v resnici 4 ali pa 3 števila ločena s pikami, potem je druga zgodba, sam tega ne poveš v svojem postu. Tudi ne poveš, če se procesira samo znak po znak...
V perlu to z regexp sprejemaš takole:
use strict; use 5.010; my @W = ("192.48.124.81", "84.125.89.0", "100.0.0.1", "100.0.1", "1.1.1.1.1.", "1", "1.1", "1.1.1", "1.1.1.1", "1.1.1.1.1", "1.1.1.1.1.1.1"); foreach my $w (@W) { my $is_member = 0; $is_member = 1 if ( $w=~m/^\d{1,3}\.\d{1,3}\.\d{1,3}(\.\d{1,3})?$/ ); say $w . " is member " . $is_member; } # Rezultati: 192.48.124.81 is member 1 84.125.89.0 is member 1 100.0.0.1 is member 1 100.0.1 is member 1 1.1.1.1.1. is member 0 1 is member 0 1.1 is member 0 1.1.1 is member 1 1.1.1.1 is member 1 1.1.1.1.1 is member 0 1.1.1.1.1.1.1 is member 0
NKA pa narediš tako, kot ste se to učili v šoli... sam sem že pozabu... zapiske mam pa 6000 milj daleč :)
Je pa to ena najbolj uporabnih snovi iz celega FRI faksa po mojem mnenju, in ti miljonkrat pride prav (predvsem ta del kako naredit RI), seveda, če bo tvoja kariera zašla v smer programiranja ali testiranja. Večina ljudi RIjev nikoli ne dojame, tudi tisti primerki, ki smo bili na FRIju.
Zgodovina sprememb…
- spremenil: milc ()
hatchette ::
Za IP naslove je uporaba REGEX-a napaka. Vsi sodobni programski jeziki imajo proper parser vkljucen by default. Ce ne drugega uporabis inet_aton, ip2long, ...
Zakaj regex sucks za tole?
- IP naslov s stringom "10" je popolnoma valid in se prevede v "0.0.0.10". Prav tako je valid (in predvsem zelo uporabljan) "10.1", ki se prevede v "10.0.0.1"...
- netmask. rezultati ki jih dobis iz regexpa so popolnoma neuporabni za maskanje
Sej lepo in prav, da vas na faxu ucijo uporabljati razlicna orodja, je pa napaka da vas ucijo uporabljati napacna orodja.
se enkrat ponovim: ce resujes problem z regexpom, imas potem dva problema.
Zakaj regex sucks za tole?
- IP naslov s stringom "10" je popolnoma valid in se prevede v "0.0.0.10". Prav tako je valid (in predvsem zelo uporabljan) "10.1", ki se prevede v "10.0.0.1"...
- netmask. rezultati ki jih dobis iz regexpa so popolnoma neuporabni za maskanje
Sej lepo in prav, da vas na faxu ucijo uporabljati razlicna orodja, je pa napaka da vas ucijo uporabljati napacna orodja.
se enkrat ponovim: ce resujes problem z regexpom, imas potem dva problema.
infiniteLoop ::
Prejsnji primeri delujejo tudi v primeru "IPjev": 999.789.321.658. Malo boljsa resitev:
^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$
EDIT: Se opravicujem za mimobrc. Ker nisem dovolj dobro prebral originalnega posta sem mislil da gre za validacijo IPjev.
^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$
EDIT: Se opravicujem za mimobrc. Ker nisem dovolj dobro prebral originalnega posta sem mislil da gre za validacijo IPjev.
None of us is as dumb as all of us.
Zgodovina sprememb…
- spremenil: infiniteLoop ()
technolog ::
.*
Ustreza vsem vrsticam.
Bolj zares pa je tale regex:
(?:\d+\.?)*
ki matcha neomejeno številk in pik med njimi.
Ustreza vsem vrsticam.
Bolj zares pa je tale regex:
(?:\d+\.?)*
ki matcha neomejeno številk in pik med njimi.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | MBWE-WL 1 TB nadgradnja na 2 TBOddelek: Pomoč in nasveti | 2155 (1781) | sas084 |
» | Regularni izraz - bashOddelek: Programiranje | 817 (663) | Spura |
» | c# regularni izrazOddelek: Programiranje | 2029 (1727) | darkolord |
» | Regexp, grep, awk problem?Oddelek: Programiranje | 1711 (1433) | Brane2 |
» | Film malo pred koncem zaštekaOddelek: Zvok in slika | 2026 (1949) | mmilos |