[Java] Regular expressions (Username)

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
Op het invoeren van een bepaalde username wil ik een aantal checks uitvoeren.
Om alvast rekening te houden dat de specs van de username nog een keer kunnen veranderen wil ik dit d.m.v. een regular expression in de database vastleggen.

Gebruikersnaam moet aan de volgende voorwaarden voldoen:
  • De lengte moet tussen de 5 en 32 characters groot zijn.
  • De letters moeten lowercase zijn
    (dit is geen probleem want wordt met aanmaken als met inloggen lowercase gezet).
  • Er mogen zowel letters als cijfers in voorkomen.
  • Er mogen geen spaties in voorkomen.
  • Er mogen "punt", "horizontal stripe" en "underscore" in voorkomen.
  • De bovengenoemde characters mogen niet aan het begin en het eind voorkomen.
  • De bovengenoemde characters mogen niet achter elkaar staan.
De regular expression die ik tot nu toe gevonden heb is:
Java:
1
"([a-z0-9]{1,1})([-._0-9a-z]{3,30})([a-z0-9]{1,1})"


Deze expression zorgt al voor de eerste 6 punten, maar nog niet voor de laatste.
Is het mogelijk om dit vast te leggen met een regular expression, en zo ja, hoe?

Verder heb ik bij het code-blok het eerste en laatste blok expliciet aangegeven dat dit om echt het eerste en het laatste character gaat.
Dit om de verwarring minder groot te maken dat het niet om 3 tot 30 characters gaat maar dat je er bij beide 1 op moet tellen.
Is het ook mogelijk om dit hele blok samen te nemen dat je op het einde dus {5,32} krijgt?

Heel verhaal maar hoop dat het zo duidelijk genoeg is :P

  • xos
  • Registratie: Januari 2002
  • Laatst online: 20:00

xos

Dit is toch eenvoudig op te lossen met een tweede reguliere expressie die alleen kijken of de punt, horizontal stripe en underscore achter elkaar voorkomen? Of mis ik iets? De laatste keer dat ik iets met reguliere expressies heb gedaan is alweer tijden terug dus op hoop van zegen ;)
code:
1
([.-_]{2})

Als dit matched dan is het niet geldig volgens jouw regels?

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
xos schreef op vrijdag 24 maart 2006 @ 09:21:
Dit is toch eenvoudig op te lossen met een tweede reguliere expressie die alleen kijken of de punt, horizontal stripe en underscore achter elkaar voorkomen? Of mis ik iets? De laatste keer dat ik iets met reguliere expressies heb gedaan is alweer tijden terug dus op hoop van zegen ;)
code:
1
([.-_]{2})

Als dit matched dan is het niet geldig volgens jouw regels?
Tja dat zou idd kunnen.
Maar wat ik wil is dit in één regular expression vast te leggen.

Anders krijg ik allemaal verschillende properties in de database met:

username_length_regex
username_characterset_regex
etc.
etc.

ik wil dit dus gewoon met één propertie vast kunnen leggen als dit mogelijk is:
username_regex ([a-z0-9]{1,1})([-._0-9a-z]{3,29})([a-z0-9]{1,1})

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Met een | (pipe) kun je een 'or' nabootsen. Ofwel kun je kijken of één van de twee operands ok is. Ik weet zo snel niet of er een 'and' bestaat. Misschien &, maar ik heb het nog nooit.

Ik zou zeggen, pak beide regexen, zet er een & tussen en kijk of het klopt.

Volgens mij is een AND namelijk de oplossing: hij moet aan de ene voldoen, en tegelijk aan de andere

Fat Pizza's pizza, they are big and they are cheezy


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
JKVA schreef op vrijdag 24 maart 2006 @ 10:02:
Met een | (pipe) kun je een 'or' nabootsen. Ofwel kun je kijken of één van de twee operands ok is. Ik weet zo snel niet of er een 'and' bestaat. Misschien &, maar ik heb het nog nooit.

Ik zou zeggen, pak beide regexen, zet er een & tussen en kijk of het klopt.

Volgens mij is een AND namelijk de oplossing: hij moet aan de ene voldoen, en tegelijk aan de andere
Werkt helaas niet, hij kent inderdaad wel het | (OR) teken maar niet &.
Dit teken ziet hij dan letterlijk als het &-teken en verder niet ;(

  • PunisherADF
  • Registratie: Oktober 2005
  • Laatst online: 02-04-2025
AND = && ipv &, tog? :9

  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

Bijde zijn logical operators en werken gewoon in een if statement
verschil is echter dat de & altijd alle operands checken terwijl && dit alleen doet als de linkse voorwaarde true is.
Hetzelfde geldt voor | en ||

It's scientifically known, that base improves the tase of cheezes!


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Volgens mij haalt dip Java en regex syntax door elkaar. :P

offtopic:
beetje opletten Ron :)

Fat Pizza's pizza, they are big and they are cheezy


  • dip
  • Registratie: September 2003
  • Laatst online: 16-01-2023

dip

shut up ulé

ik reageer ook op de reactie van PunisherADF omdat juist hij de syntax door elkaar haalt. Oke, ik geef toe, ik had erbij moeten zetten dat dit de java syntax was :)

offtopic:
Gvd, nu weet de hele wereld mijn naam :s
moet ik je maandag nog harder gaan ownen met tafelvoetbal :)

It's scientifically known, that base improves the tase of cheezes!


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
Goed inmiddels zo'n beetje alles met |, ||, & en && geprobeerd maar op deze manier geen steek verder gekomen. :P

Maar es een compleet andere benadering gaan proberen en op het volgende uitgekomen:

Java:
1
"[a-z0-9]+([\\._-]{1}[a-z0-9]+)*"


Een heel wat mooiere en duidelijkere notatie dacht ik zo.
Maarrrr.... op deze manier raak ik juist de laatste 6 punten en mis ik nog de eerste.
Oh, erg makkelijk dacht ik, nog ff ergens {5,32} tussen plakken en hier trots posten dat het gelukt is! :*)

Dit laatste krijg ik met deze regex dus weer niet voor elkaar.
Iemand tips?

edit:
laat maar |:(
[code=java]
"[a-z0-9]+([\\._-]{1}[a-z0-9]{3,30})*"
[/code]


Nog niet goed: nu kijkt hij ná een . - of _ of er nog 3 tot 30 andere karakters in voorkomen.
Moet in totaal zijn.....

[ Voor 22% gewijzigd door bvp op 24-03-2006 14:43 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Ik begrijp niet waarom dit je laatste puntje oplost. Er kunnen nu toch nog steeds een aantal dezelfde karakters achter elkaar gezet worden?

Waarom mag dat trouwens niet? Het is toch niet vreemd dat er bijvoorbeeld 2x een 'a' na elkaar staat?

Fat Pizza's pizza, they are big and they are cheezy


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
JKVA schreef op vrijdag 24 maart 2006 @ 14:17:
Ik begrijp niet waarom dit je laatste puntje oplost. Er kunnen nu toch nog steeds een aantal dezelfde karakters achter elkaar gezet worden?

Waarom mag dat trouwens niet? Het is toch niet vreemd dat er bijvoorbeeld 2x een 'a' na elkaar staat?
Dat laatste puntje los ik niet op die "escape" ik alleen maar dat het alleen maar om een "." gaat en niet om "elke character". In regular expressions betekent de punt namelijk elk karakter.

Dus hij kijkt niet of er bijv. 2x een 'a' achter elkaar staat maar hij kijkt alleen maar of er niet 2x een punt of een stripe of een underscore achter elkaar staat. (zie TS).

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
Heb op het moment zo'n beetje overal wel die {5,32} neergezet maar elke keer werkt er dan weer iets anders niet. Dan gelden bijv. het aantal characters wel maar dan ignored hij dat een woord niet met een _ mag beginnen ;(

Niemand een idee hoe ik onderstaande zo kan veranderen dat alle regels blijven gelden en dat de totale string maar 5 tot 32 characters groot mag zijn?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
        String username = "test_user";
        String username_regex = "[a-z0-9]+([\\._-]{1}[a-z0-9]+)*";
        
        try {
            boolean foundMatch = username.matches( username_regex );
            System.out.println("Valid username? " +foundMatch);
        } 
        catch (PatternSyntaxException ex) {
            // Syntax error in the regular expression
            System.out.println( ex.toString() );
        }
    }

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Is het een probleem om in de applicatie een min size en een max size op te geven? Daar wordt het niet minder netjes/beheerbaar van volgens mij.

Bovendien kun je dan ook een keer een bepaald veld alleen op lengte checken zonder dat het nodig is dat je een een regex moet klussen.

In JavaServer Faces bijvoorbeeld, kun je verschillende validators aan een veld hangen, zoals required, minlength, maxlength, minvalue, maxvalue, pattern, etc... Kei handig. :P

Fat Pizza's pizza, they are big and they are cheezy


  • bvp
  • Registratie: Maart 2005
  • Laatst online: 23-02 12:02
JKVA schreef op vrijdag 24 maart 2006 @ 15:34:
Is het een probleem om in de applicatie een min size en een max size op te geven? Daar wordt het niet minder netjes/beheerbaar van volgens mij.

Bovendien kun je dan ook een keer een bepaald veld alleen op lengte checken zonder dat het nodig is dat je een een regex moet klussen.

In JavaServer Faces bijvoorbeeld, kun je verschillende validators aan een veld hangen, zoals required, minlength, maxlength, minvalue, maxvalue, pattern, etc... Kei handig. :P
Tja als ik controle zou hebben over de invoer zou ik dat achter elkaar doen, maar dat is helaas niet zo :)
Deze gebruikersnaam komt via een webservice binnen, dus aan een bepaald component deze restrictie opleggen is hier geen mogelijkheid.

Nou zou ik in mijn code wel (al dan niet hardcoded) de length kunnen controleren maar dat werkt ook niet.
Hardcoded niet omdat bij een wijziging in lengte de code aangepast moet worden en met property in database niet omdat ik dan meerdere properties heb voor 1 gebruikersnaam.
Nou zou dat op zich niet zo'n probleem zijn als het ECHT niet anders zou kunnen maar ik weet dat met regular expressions dit wel vast te leggen is.
Dus dan moet en zal ik dit ook zo doen :P

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Dan weet ik het ook echt niet meer. Ik vind het wel raar dat je met regular expressions geen 'and' kunt doen en wel een 'or'. Ik weet gewoon zeker dat dat de oplossing zou zijn. :P

Fat Pizza's pizza, they are big and they are cheezy

Pagina: 1