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

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


Lazarus
  1. var
  2.    r: TRegExprEngine;
  3.    index,len: integer;
  4.    p:pchar;
  5.    mail:string;
  6. begin
  7.      //mail:=email.text;
  8.      //mail:='ime@domain.com';
  9.      mail:='ime@domain.com@#@$';
  10.      p:=strnew(pchar(mail));
  11.      r := GenerateRegExprEngine('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+',[ref_singleline]);
  12.      if not RegExprPos(r,p,index,len) then
  13.         ShowMessage('Nije ispravan')
  14.      else
  15.         ShowMessage('Ispravan je');
  16.      DestroyregExprEngine(r);
  17. end;


Ovde sam nasao primere/definicije ali mi nikako ne ide. [Link mogu videti samo ulogovani korisnici]

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:

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

  1. .[\w\d\-]+)+\S
  2. .[\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:

  1. 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.
  1. 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):
  1. # a='ime@domen.com@$#'
  2. # b=$(echo "$a" | sed -e 's/\([#$@]\)/\\\1/2g;')
  3. # echo $b
  4. [Link mogu videti samo ulogovani korisnici]\@\$\#
  5. # eval echo $b
  6. [Link mogu videti samo ulogovani korisnici]@$#
  7. #

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):
  1. # a='ime@domen.com'
  2. # b='ime@domen.companija'
  3.  
  4. // regex moze naci od 2 do 4 karaktera posle tacke:
  5.  
  6. # echo "$a" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{2,4}/==>&<==/g'
  7. ==>ime@domen.com<==
  8. # echo "$b" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{2,4}/==>&<==/g'
  9. ==>ime@domen.comp<==anija
  10.  
  11. // regex ce naci tacno 3 karaktera posle tacke:
  12.  
  13. # echo "$a" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{3}/==>&<==/g'
  14. ==>ime@domen.com<==
  15. # echo "$b" | sed -re 's/[a-z]+@[a-z]+\.[a-z]{3}/==>&<==/g'
  16. ==>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

  1. //ovo je sledeci izraz :D
  2. [\w\d\-\.]+@[\w\d\-]+\.[\w\d{2,4}]+[\w\d]

  1. http://www.mediafire.com/?ztmydwgon3z

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

C# (iz zadatka koji sam imao na fakultetu):

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

[Link mogu videti samo ulogovani korisnici]

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:

[Link mogu videti samo ulogovani korisnici]

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

[Link mogu videti samo ulogovani korisnici]

[Link mogu videti samo ulogovani korisnici]



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 1176 korisnika na forumu :: 46 registrovanih, 5 sakrivenih i 1125 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: Adaminho1985, Akiro, Astore Vajola, bolimejoli, BORUTUS, C-Gun, ccoogg123, debeli, dexteroza, doom83, dragoljub11987, Feller, goran.vvv, hermann.kottmann, ILGromovnik, interesujeme, istina, Jozo74, K2, karevski, koom0001, Koča, kybonacci, m0nstrum_, Mercury, milenko crazy north, nuki1234, paja69, pein, pfc74, Polifon, Prečanin30, PrincipL, Samo gledam, sap, Savantije, Schepan, Sićko, smerch, Solunac na steroidima, T5, taomaster, Vanderx, VJ, vladetije, zlaya011