Šta je novo?

Regular Expressions pitanje

TEP3A

Čuven
Učlanjen(a)
07.02.2002
Poruke
2,106
Poena
765
Treba mi regexp (koristim ga u javi) koji ce da prepozna kada se u jednom stringu nalaze brojevi I slova. Znachi, mora da se nalaze i brojke i slova da bi string.match(regexp) vratio true, a string moze da sadrzi i neki od ():_ @#$%^& koji se ne gledaju.

Primer:

Rollstuhlplätze: 01/225 25 50 (während der Büroöffnungszeiten)

regexp prepoznaje slova i brojeve, zagrade i ostali ga ne zanimaju i vraca true. Ako nema brojeva, vraca false, ako nema cifara, vraca false...

Neka ideja????
 
Smislio sam jednostavno rešenje koje, čini mi se, zadovoljava uslov koji tražiš:

[a-z].*[0-9]|[0-9].*[a-z]

Ako string uvek počinje slovima onda je sasvim dovoljno i

[a-z].*[0-9]

Nadam se da nema potrebe da objašnjavam šta i kako ovaj RegEx radi?
 
Poslednja izmena:
Puno hvala na odgovoru!!!

ali

[a-z].*[0-9]|[0-9].*[a-z] vraca true za "text: bojevi" ali za navedeni primer u startnom postu vraca false...

znachi moram da smislim Regexp koji vraca true ako u stringu imam broj i slovo u bilo kojoj kombinaciji.....

EJ, I gde je tvoj prvi post????????
 
Ako ti trebaju RegExp izrazi na razne nacine i ubuduce, probaj regexbuddy programce. (http://www.regexbuddy.com/ )

Jako lako se kreiraju izrazi koji rade posao a mozes i u samom programu da testiras koliko su dobri.
 
Da li mora da bude jedan regexp?
Ako ne, str.matches("^.*[a-zA-Z].*$") && str.matches("^(.*)[0-9](.*)$"), će da odradi posao.
 
TEP3A je napisao(la):
[a-z].*[0-9]|[0-9].*[a-z] vraca true za "text: bojevi" ali za navedeni primer u startnom postu vraca false...
Ali... Onda ta tvoja Java koristi neku krajnje čudnu sintaksu. Ja sam sad probao sa The RegEx Coach i PCRE i oba slučaja radi kako treba, za primer iz tvog prvog posta vraća TRUE a za "text: bojevi" vraća FALSE.

Nije nikakva misterija zašto je to tako: [a-z] traži makar jedno slovo (ako je case sensitive onda treba promeniti u [a-zA-Z]) za kojim sledi 0 ili više bilo kojih znakova, osim carriage return (.*) za čime sledi najmanje jedna cifra [0-9] a iza | je obratno, cifra pa slovo. Dakle, u standardnoj RegEx sintaksi to mora da radi. Znači, ako nema ni jednog slova ili ako nema ni jedne cifre mora da vrati FALSE. Ako postoji makar jedno slovo i makar jedna cifra mora da vrati TRUE.

A prvi post sam obrisao jer mi je delovalo da je tu rešenje ali sa if then else ja nisam uspeo da nađem rešenje.

Da ne bude da ja lupam, eva go i screenshot iz RegEx Coach-a (žuto je deo stringa koji zadovoljava uslov(e) i zbog koga vraća TRUE, ako baš treba da "označi" ceo string, mada ne znam zašto bi, to bi trebalo da obavlja [a-z].*[0-9].*|[0-9].*[a-z].*)
 

Prilozi

  • coach.gif
    coach.gif
    6.1 KB · Pregleda: 56
Poslednja izmena:
Kao prvo neizmerno hvala na pomoci!!!

koristim:

if (string.matches("regexp")) { uradi nesto...}

i to nesto se ne uradi kada je ovaj regexp ([a-z].*[0-9]|[0-9].*[a-z])....

verovatno zato sto matcuje samo prvi text i cifre a ono iza ne, kao sto i tvoj screenshot pokazuje...

sad cu da probam jddipqd - ovo resenje... ne mora da bude jedan regexp.. moze da ih bude vise....

pa javljam!
 
wiz011 je napisao(la):
Nije nikakva misterija zašto je to tako: [a-z] traži makar jedno slovo (ako je case sensitive onda treba promeniti u [a-zA-Z]) za kojim sledi 0 ili više bilo kojih znakova, osim carriage return (.*) za čime sledi najmanje jedna cifra [0-9] a iza | je obratno, cifra pa slovo.
Tvoj regularni izraz trazi ne makar jedno, nego iskljucivo jedno slovo iza koga sledi bilo sta 0 ili vise puta, iza cega sledi tacno jedan broj. Ovaj regularni izraz nece raditi u slucaju da algoritam nije greedy, jer ce pokupiti samo prvi match-ovani regularni izraz a to je "Rollstuhlplätze: 01/225 25 50". Mada mi je i sam regularni izraz malo konfuzno napisan jer i [a-z] i [0-9] potpadaju pod .*, a nigde se ne zahteva da string pocinje slovom ili brojem i istim se zavrsava.

poz.
 
Sad kad bolje razmislim [a-z].*[0-9]|[0-9].*[a-z] nikako nece raditi jer ga koce iskljuciva slova i brojevi na pocetku i kraju koja rade ili ili, znaci slovo-nesto-broj ili broj-nesto-slovo a sam test primer se zavrsava sa zagradom. Malo benignija varijanta bi bila [a-z0-9].*[a-z0-9] ali ni to nece raditi kako treba jer u zagrade treba ukljuciti specijalne karaktere. Da zakljucim, da bi ti ovo proradilo 100% kako treba, trebaju ti anchor pravila jer je sve ostalo varijacija na .* .

poz.
 
Poslednja izmena:
@vidakm

Sorry, ali uopšte nisi u pravu jer nigde ne postoji nešto poput \A pa da string mora da počinje slovom ili brojem, kao što tvrdiš. Tačno je da taj regularni izraz traži samo jedno slovo, ali kada govorimo o stringu to znači da traži string u kome postoji makar jedno slovo (i to je "pisac hteo da kaže" mada mi je jasno da se u brzini nisam sasvim precizno izrazio).

Bojim se da ti ne razumeš baš sasvim kako RegEx rade, jer oni ne rade tako kako ti tvrdiš (tako kako ti tumačiš bi radio izraz \A[a-z].*[0-9]|\A[0-9].*[a-z]).

[a-z] znači "ispituj string sve dok ne naiđeš na nešto što je slovo" (\A[a-z] znači "počinje sa slovom"), .*[0-9] znači "teraj dalje sve dok postoji ma kakav znak koji nije CR posle koga sledi neka cifra".

Nije mi uopšte jasno šta ti znači "pokupiće prvi matchovani regularni izraz". Traženi uslov je da RegEx vrati TRUE ako string sadrži makar jedno slovo i makar jedan broj. Ovaj RegEx zadovoljava zadati uslov.

Uostalom, nema razloga da se nagađa, uzmi neki od standardnih test programa (poput The Regex Coach ili RegEx Buddy) pa proveri da li ovaj RegEx radi onako kako ja kažem ili onako kako ti tvrdiš da radi.

@TEP3A

Tvoj prvobitni uslov je bio da RegEx detektuje da li u stringu postoje istovremeno i slova i brojevi, nije se zahtevalo da ceo string mora biti matchovan. Ja se ograđujem utoliko što nemam pojma kako funkcionišu RegEx u Javi (ne postoji nikakva do kraja unificirana RegEx sintaksa i ovde se, sva je prilika, suočavamo upravo sa tim problemom).

No, ako ja nisam sasvim prolupao, sledeći RegEx bi morao da matchuje ceo string:

.*[a-zA-Z].*[0-9].*|.*[0-9].*[a-zA-Z].*
 
Poslednja izmena:
@wil011

Prijatelju, ja i ti se ocigledno ne razumemo. Taj anchor koji ti upotrebljavas \A pretpostavljam da znaci na pocetku linije (ja koristim ^), ja sam naravno mislio na pocetak prepoznatog stringa. Ostatak price je manje vise presipanje iz supljeg u prazno. A sto se tice mog "nepoznavanja" RegEx i "Nije mi uopšte jasno šta ti znači "pokupiće prvi matchovani regularni izraz".", teorija prevodilaca ili lex tutorijal, pa na citanje :). Salim se, naravno. Ovo je bilo bez namere da budem bezobraza, ali ocigledno postoji neka vrsta nesporazuma pa cu se suzdrzati od daljeg spama.

poz.
 
wiz011 je napisao(la):
No, ako ja nisam sasvim prolupao, sledeći RegEx bi morao da matchuje ceo string:

.*[a-zA-Z].*[0-9].*|.*[0-9].*[a-zA-Z].*

Ne nisi! :d Radi k'o Zmaj!!!
 
Nazad
Vrh Dno