Avatar billede b_ Nybegynder
21. april 2008 - 13:10 Der er 8 kommentarer og
1 løsning

Java: Regex problem

Jeg skal bruge en regex der tjekker om en string indeholder tal og bogstaver (Den skal minimum indeholde et tal og et bogstav). Nedenstående kode udskriver NOT hele tiden.

String pass = "bhkkk99";
     
      Pattern pattern = Pattern.compile("[a-z0-9]", Pattern.CASE_INSENSITIVE);
      Matcher matcher = pattern.matcher(pass);
       
      if(matcher.matches()) {
          System.out.println("OK");
      } else {
          System.out.println("NOT");
      }
Avatar billede erikjacobsen Ekspert
21. april 2008 - 13:38 #1
Pattern pattern = Pattern.compile("[a-z0-9]+", Pattern.CASE_INSENSITIVE);
Avatar billede b_ Nybegynder
21. april 2008 - 13:48 #2
Nu acceptere den hvis man kun indtaster bogstaver eller tal, jeg vil gerne have den til at man minimum skal have et bogstav, et tal og evt. et tegn i pass.
Avatar billede nielle Nybegynder
21. april 2008 - 17:19 #3
Mindst et tal, mindst et bogstav:

^(?=.*?[0-9])(?=.*?[a-z])[a-z0-9]*$


Jeg er ikke sikker på hvad du mener med "et tegn".
Avatar billede b_ Nybegynder
21. april 2008 - 21:52 #4
Ja undskyld, dårlig formuleret. Med tegn mener jeg et special tegn! Men ved ikke om det er muligt?
Er du sød at forklare hvad ?=.*? gør? Kan godt se at den sikre at der minimum bliver indtastet et tal/bogstaver.

Og endelig, smid et svar :)
Avatar billede nielle Nybegynder
22. april 2008 - 06:47 #5
> Med tegn mener jeg et special tegn!

Ja, men hvilke tegn mener du så med det?


PS: Jeg skal nok forklare hvad det er (?=regexp) gør når jeg har lidt mere tid. I mellemtiden kan du jo kaste dig over mine artiker her på E:

http://www.eksperten.dk/artikler/1156
http://www.eksperten.dk/artikler/1157
http://www.eksperten.dk/artikler/1160
http://www.eksperten.dk/artikler/1162

Den opskrift jeg har brugt er beskrevet sidst i den 4. artikel, men det kan være at du skal have læst de andre for at få lidt af grundlaget.
Avatar billede b_ Nybegynder
22. april 2008 - 13:45 #6
Har løst det på denne måde: ^(?=.*?[@#£¤$%&])(?=.*?[0-9])(?=.*?[a-z])[a-z0-9@#£¤$%&]*$

Men burde det ikke kunne gøres kortere? Forstår ikke ?=.  - er med på at *? matcher 0 eller flere, men en kort forklaring ville være dejlig :)
Avatar billede b_ Nybegynder
22. april 2008 - 14:00 #7
Okay har lige læst lidt i dine artikler, ros herfra. Og har læst om positive lookaheads, så det den gør hvis jeg har forstået ret er at [a-z0-9@#£¤$%&] matcher det der fx står i første paretens ?=.*?[@#£¤$%&] osv. Okay jeg er en skovl til at forklare det. Men kan ikke se hvor den siger at det minimum skal være der en gang, men bare 0 til mange?
Avatar billede nielle Nybegynder
22. april 2008 - 19:06 #8
> Men burde det ikke kunne gøres kortere?

Der er ingen som siger at regexp er løsningen på al verdenens problemer. F.eks. kan det ikke gøre meget mere kompakt hvis det absolut skal gøres i en omgang. Løsningen kan sagtens laves "pænere" hvis man vælger at dele den ud over et tjek pr. betingelse.

> Og har læst om positive lookaheads, så det den gør hvis jeg har forstået ret er at [a-z0-9@#£¤$%&] matcher det der fx står i første paretens ?=.*?[@#£¤$%&] osv.

En lille smule pænere sat op:

^(?=.*?[a-z])(?=.*?[0-9])(?=.*?[@#£¤$%&])[a-z0-9@#£¤$%&]*$

Delmønsteret [a-z0-9@#£¤$%&]* angiver hvilke tegn som er lovlige tegn. Tilføjer man bare et tegn som ikke er matchet af denne det, vil matchningen som helhed fejle.

Det er de derimod enkelte lookahead-led, som f.eks. (?=.*?[a-z]), der sikre at passwordet heller ikke matches hvis der er mindste et bogstav (et af tegnene a-z).

Jeg indrømmer gerne at de er svære at forstå endsige forklare. Det eneste der hjælper er erfaring og en masse forsøg.

Den centrale del ar denne her:

regexp1(?=regexp2)

Et sådant mønster vil kun blive matchet, hvis teksten ”regexp1” efterfølges af teksten ”regexp2”. Den vil derfor matche:

regexp1regexp2

men ikke:

regexp1regexp3

I password-opskriften er regexp1 lig med:

^

og regexp2 lig med

.*?[a-z]

Mønsteret:

^(?=.*?[a-z])

Matcher derfor starten af strengen (^) hvis og kun hvis den efterfølges at et vilkårligt antal tegn (.*?) efterfulgt af et bogstav ([a-z]). Det er den del som sikre at der er mindst et bogstav.
Avatar billede b_ Nybegynder
22. april 2008 - 22:20 #9
Nu begynder der at ringe nogle klokker :) Mange tak for din tid, og din gode forklaring.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester