Regular expression

Regular expression

offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Po ugledu na delphi kod uradio sam u lazarusu regular expression za proveru maila. Problem nastaje kada na kraju maila dodam nedozvoljene karaktere.

Delphi
http://www.latiumsoftware.com/en/articles/00009.php

Lazarus
var    r: TRegExprEngine;    index,len: integer;    p:pchar;    mail:string; begin      //mail:=email.text;      //mail:='ime@domain.com';      mail:='ime@domain.com@#@$';      p:=strnew(pchar(mail));      r := GenerateRegExprEngine('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',[ref_singleline]);      if not RegExprPos(r,p,index,len) then         ShowMessage('Nije ispravan')      else         ShowMessage('Ispravan je');      DestroyregExprEngine(r); end;

Ovde sam nasao primere/definicije ali mi nikako ne ide. http://wiki.lazarus.freepascal.org/IDE_regular_exp.....ply_syntax

Ostaje mi da trazim pozicije nedozvoljenih karektera i da prikazem gresku ako ih ima ali me zanima da li neko ima ideju kako da resim ovaj izraz?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Napisano: 07 Mar 2010 22:01

Prvo, ti karakteri na kraju u ekstenziji domena ionako nisu validni. Smile Mozes da uradis nesto sledece kako bi ogranicio ekstenziju:
regex_pre_toga \.[\w]{2,4}
Ovo ce filtrirati samo ispravne ekstenzije (.net, .com, .edu, .gov, .rs, .eu ...)

Ako bas hoces da "uhvatis" email adresu kakva jeste, onda mozes da probas da stavis "\" ispred svakog specialnog karaktera. Ovo je mozda manje elegentno resenje, ako ti treba primer kazi.

Dopuna: 08 Mar 2010 0:25

Sad bacih pogleda na to sta Lazarus podrzava od regexp izraza, za tu zadnju grupu mozes da upotrebis "\S", sto znaci "svaki zivi moguci karakter koji nije space". Ali opet, neznam zasto bi imao neke karaktere (bilo koje) na kraju ekstenzije domena.



offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Ono sto sam gore napisao je samo za primer bilo da bi videli sta se desava. Ja zapravo uzimam vrednost iz textboxa i onda proveravam pa da ne bi dolazilo do bezveznog upisavanja onda bih ubacio regexp a s' obzirom na to da mi ne ide nikako onda cu da rasparcam. Svaki primer je dobrodosao. Probao sam i \s i \S ali ocigledno na pogresno mesto

.[\w\d\-]+)+\S .[\w\d\-]+\S)+'

Zaboravih i ono sto si napisao {2,4} ali ne biva.

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Napisano: 08 Mar 2010 11:52

Ne, ne tako:
r := GenerateRegExprEngine('[\w\d\-\.]+@[\w\d\-]+\.[\S]+',[ref_singleline]);
To je ono sto ti hoces. Po mom skromnom misljenju lose.
Ovo je ono sto ti preporucujem.
r := GenerateRegExprEngine('[\w\d\-\.]+@[\w\d\-]+\.[\w]{2,4}',[ref_singleline]);

A evo primera kako da sprecis da se meta-karakteri interpretiraju (ovde koristim sed, stream editor na *nix sistemima, ali je regex slican i dovoljan za primer):
# a='ime@domen.com@$#' # b=$(echo "$a" | sed -e 's/\([#$@]\)/\\\1/2g;') # echo $b ime@domen.com\@\$\# # eval echo $b ime@domen.com@$# #
Znaci ubacis one karaktere koje hoces da izbegnes (u ovom primeru tri: @,# i $) i onda ispred njih stavis "\".

Dopuna: 08 Mar 2010 12:08

Ako te buni ovo "{2,4}", mozda ti ovo razjasni cemu sluzi (isto sed, ali je regex isti):
# a='ime@domen.com' # b='ime@domen.companija' // regex moze naci od 2 do 4 karaktera posle tacke: # echo "$a" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{2,4}/==>&<==/g' ==>ime@domen.com<== # echo "$b" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{2,4}/==>&<==/g' ==>ime@domen.comp<==anija // regex ce naci tacno 3 karaktera posle tacke: # echo "$a" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{3}/==>&<==/g' ==>ime@domen.com<== # echo "$b" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{3}/==>&<==/g' ==>ime@domen.com<==panija
Ubacio sam strelice "==>" i "<==" kako bi video gde pocinje i zavrsava se regex.

offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Probao sam ovo sto si mi preporucio i jos neke kombinacije. U 7z je source i exe pa ako imas vremena probaj. Kad ogranicim duzinu posle tacke posle dve provere program pukne ali kad upisem sledeci izraz onda ne puca ali posle tacke ako ima vise od cetiri karaktera onda i dalje kaze da je ispravan. Jos sta se desava... pre "majmuna" upisem jos neke nedozvoljene karaktere ali prikazuje da je ispravan Shocked

//ovo je sledeci izraz :D [\w\d\-\.]+@[\w\d\-]+\.[\w\d{2,4}]+[\w\d]
http://www.mediafire.com/?ztmydwgon3z

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

C# (iz zadatka koji sam imao na fakultetu):
Regex mail = new Regex(@"[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}");

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

Nikad nisam napisao ni slovce koda u Lazarusu, samo sam hteo da pomognem oko regexa, tako da ti nemogu dalje pomoci jer izlgeda da negde gresis u kodu. Regexi su ispravni, kao i ovaj sto ti je dao bobby, mozes da proveris ovde:

http://gskinner.com/RegExr/

Lepo se prikazuje sta se poklapa i gde regex prestaje.

Neznam dal ti hoces da napravis jednsotavni "email validator" ili da uklopis kod u neku drugu aplikaciju? Ako proGooglas za email validation izbaci ce dosta korisnih linkova, npr:

http://www.regular-expressions.info/email.html

Moraces i da vidis koji su sve validni karakteri dozvoljeni u email adresi, npr (pogledaj RFC dokumenta):

http://www.remote.org/jochen/mail/info/chars.html

http://www.breakingpar.com/bkp/home.nsf/Doc!OpenNa.....40004CC8C6



P.S. Gore sam bio kopirao tvoj kod, a samo ispravio zadnji deo. U njemu treba da stoji [\w] bez [\w\d] jer \w obuhvata sve alfanumericke karaktere, samim tim i brojeve koji su viskom navedeni. Znaci regex bi bio: [\w\-\.]+@[\w\-]+\.[\w]{2,4}, plus ostali karakteri koji su validni u email adresi (vidi link gore).

offline
  • Pridružio: 15 Maj 2006
  • Poruke: 333
  • Gde živiš: Babušnica

Napravicu pauzu sto se tice izraza pa cu se naknadno baviti time. Hvala na linkovima i primerima, guglao sam ja i gledao svakakve izraze, cak za php imam taj odgovarajuci izraz ali je problem ovde u lazarusu, videcemo Smile.

Ko je trenutno na forumu
 

Ukupno su 1337 korisnika na forumu :: 43 registrovanih, 7 sakrivenih i 1287 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., antonije64, babaroga, bagor10, Battlehammer, Bubili, cenejac111, cikadeda, CikaKURE, darionis, darkangel, Dimitrise93, Dorcolac, DPera, draganl, Faki-Valjevo, FileFinder, GandorCC, hooraay, hyla, ikan, Istman, kihot, kolle.the.kid, krkalon, kybonacci, Lieutenant, Mcdado, mercedesamg, MilosKop, milutin134, Mixelotti, nemkea71, nick79, Parker, prashinar, robert1979, royst33, S-lash, Smd, Stoilkovic, vathra, wolf431