» »

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

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.

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

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:
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.

arjan_t ::

saj je napisal da rabi za leksikalno analizo

scarymovie ::

hvala

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.
None of us is as dumb as all of us.

Zgodovina sprememb…

technolog ::

.*

Ustreza vsem vrsticam.

Bolj zares pa je tale regex:

(?:\d+\.?)*

ki matcha neomejeno številk in pik med njimi.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

MBWE-WL 1 TB nadgradnja na 2 TB

Oddelek: Pomoč in nasveti
152116 (1742) sas084
»

Regularni izraz - bash

Oddelek: Programiranje
6805 (651) Spura
»

c# regularni izraz

Oddelek: Programiranje
202015 (1713) darkolord
»

Regexp, grep, awk problem?

Oddelek: Programiranje
251701 (1423) Brane2
»

Film malo pred koncem zašteka

Oddelek: Zvok in slika
52020 (1943) mmilos

Več podobnih tem