Best Practice Wortregeln RegEx

  • Themenstarter Themenstarter tröööt
  • Beginndatum Beginndatum
T

tröööt

Gast
moin ...

ja auch ich kann trollen und mal wieder n neuen thread aufmachen ... geht allerdings um etwas spezielles ...

was ich machen will
im endeffekt nur ne methode der ich einen string übergebe und die mir mit nem bool als return sagt ob der string die gewünschte "form" hat ... folglich : RegEx

wo ich kleinere probleme habe
es geht darum das ich prüfen will
1) ob der string nur aus a-zA-Z0-9 besteht
2) mindestens 2 kleine buchstaben, 2 große buchstaben und 2 zahlen enthält (beliebige reihenfolge)
3) mindestlänge 8

meine bisherigen lösungen

1) mit [c][^a-zA-Z0-9][/c] prüfen ob etwas anderes als alphanum enthalten ist
laut doc gibt es dafür [c]\p{Alnum}[/c] ... schreib ich dann einfach : [c][^\\p{Alnum}][/c] oder wie müsste es korrekt lauten ?

3) String.length()>8 ... kein thema

problem bereitet mir 2)
klar könnte ich mit 3 loops über den string gehen und dabei einfach die entsprechenden zeichen zählen ...
allerdings würde ich es lieber mit RegEx machen .. und ich bin mir auch sicher das es hier was vernünftiges geben sollte ...
spontan würde mir jetzt sowas in diese richtung einfallen
[c](.*[a-z]+.*[a-z]+.*)[/c]
aber wäre das wirklich best pratice ... und würde es auch zum gewünschten ergebnis führen ?


fertigen code will ich nich ... ich bräuchte halt nur hilfe bei den direkten RegEx strings ...
das ganze in ne methode zusammenkleben schaff ich ja dann noch ... aber ich werd halt aus der doc nicht so wirklich schlau ..

wäre nett wenn mir da jemand tipps und hinweise geben könnte ...


cya
 
Zuletzt bearbeitet von einem Moderator:
Ich weiß zwar aus dem Stehgreif nicht wie man die einzelnen Bedingungen am besten verbindet, aber die Mindestmengen kannst du mit dem Mengenoperator definieren.

[c][A-Z]{2,}[/c]
[c][a-z]{2,}[/c]
[c][0-9]{2,}[/c]

Am besten organisierst du dir noch ein RegExp Tool, wenn du nicht schon hast. Das hilft mir bei solchen Dingen immer sehr gut 🙂
 
Finde sowas besser:

Java:
private static boolean isCorrectPassword(String pw){
		int numberCounter = 0;
		int UpperCaseCounter = 0;
		int lowerCaseCounter = 0;
		for(int i = 0; i < pw.length(); i++){
			char c = pw.charAt(i);
			if(Character.isUpperCase(c)){
				UpperCaseCounter++;
			} else if(Character.isLowerCase(c)){
				lowerCaseCounter++;
			} else if(Character.isDigit(c)){
				numberCounter++;
			} else {
				System.err.println("wrong pw");
			}
			
			if(numberCounter>=2 && UpperCaseCounter >=2 && lowerCaseCounter >=2){
				return true;
			}
		}
		return false;
	}
 
Meiner Meinung nach ist Regex für solche Dinge nicht geeignet, wüsste auch nicht wie in einem Ausdruck festlegen. Wenn wir uns aber die ASCII-Tabelle zu Hilfe nehmen, gibts eine tolle Lösung:
Java:
boolean test(final String s) {
    char[] c = s.toCharArray();
    Arrays.sort(c);
    return new String(c).matches("[0-9]{2,}[A-Z]{2,}[a-z]{2,}");
}
Aber verwenden würd ich das nicht unbedingt, lieber durch das Chararray iterieren und zählen...
 
[edit][WR]@Slater
es geht hier NICHT um eine passwort-prüfung ... ich bitte daher den original titel wieder herzustellen ... ggf in angepasster form .. aber "passwort regex" ist IMO ein falscher titel für mein problem

es geht hier eher um zusätzliche SQL-injection-prevention in kombination mit PreparedStatements ...

das damit natürlich auch passwörter und user-namen und sonstwas geprüft werden können ist richtig ... aber das ist NICHT der grund des themas ...[/WR]


[ot](warum kommen immer alle gleich auf passwort-prüfung nur weil man mal mit regex n string auf dessen inhalt prüfen will)[/ot][/edit]

@Evil
daran hab ich auch schon gedacht ... allerdings weis ich nicht wie genau man dem mengen-operator umgehen muss das dieser auch die anzahl auf die gesamte gruppe zählt und nicht nur direkt hintereinander folgende zeichen berechnet ... weil "aAbBcC0x0y" wäre ja nach meiner definition korrekt ... nur wie verpack ich das am besten in ne regex das er auch wirklich ABC zählt und nicht A , B und C einzeln ? das ist nämlich mein hauptproblem

@tim
gut .. auch wenn es so nur ein loop ist (wie bin ich eigentlich auf 3 gekommen ?) wäre das ne lösung die so zwar sicher ihren dienst tut ... aber nicht wirklich das was ich suche ... ich möchte es halt nach möglichkeit mit RegEx lösen ...

auch wenns in richtung mikro-optimierung geht : klar wäre ein loop schneller als aufwändig RegEx mehrfach drüber laufen zu lassen ... aber weis net ... empfinde ich irgendwie als so ... "primitiv" ... aber wenns best practise ist werd ichs trotzdem nehmen ... hauptsache am ende kommt das richtige ergebnis raus

(wobei ich in zeile 14 schon mit return false raus wäre)

@featz
hmm .. wäre auch ne möglichkeit ... aber wenn das durchgehen des char-arrays besser wäre werd ichs wohl in richtung von tim machen ...
 
Ich weiß zwar aus dem Stehgreif nicht wie man die einzelnen Bedingungen am besten verbindet, aber die Mindestmengen kannst du mit dem Mengenoperator definieren.
[c][A-Z]{2,}[/c]
[c][a-z]{2,}[/c]
[c][0-9]{2,}[/c]
Nein, denn dann müssen die Zeichenklassen aufeinander folgend im String stehen,
Code:
"pAsSw0r7"
wäre damit ungültig.

bye
TT
 
Java:
		Assert.assertEquals(true, "pAsSw0r7".split("\\d", -1).length > 2);
		Assert.assertEquals(true, "pAsSw0r7".split("[a-z]", -1).length > 2);
		Assert.assertEquals(true, "pAsSw0r7".split("[A-Z]", -1).length > 2);
		Assert.assertEquals(false, "pasSw0r7".split("[A-Z]", -1).length > 2);

bye
TT
 
Zuletzt bearbeitet:
Die bisher hier präsentierten im Ansatz auf Regex basierten Lösungen machen genau die gleichen Prüfungen, die man mit indexOf auch machen würde. Sie sparen also keinen Code und sind leider auch noch imperformanter.

Das Problem und auch die Urscache dafür, dass RegExen hier seeehr ungeeignet sind, ist dass RegEx-Strings immer eine Reihenfolge implizieren. Genau das ist hier aber nicht gewünscht. Man müsste also eine RegEx bauen, wo bei jeder der geforderten Zeichenklassen geprüft wird, ob sie überhaupt vorkommt. Dann muss man alle möglichen Kombinationen in einer Gruppe verodern und diese Gruppen wiederum verodern. An der Beschreibung merkst du, wie komplex das ist.

Mach es mit indexOf! Und schreib jetzt nicht wieder: "Ich mögchte es gerne mit RegEx lösen." 😉

Achso, und die POSIX character classes (z.B.
Code:
\p{Alnum}
) funktionieren nur, wenn der zu untersuchende Text US-ASCII codiert ist. Das ist heut zu tage nahezu kein Text mehr.
 
Das lässt sich nicht mit Regex lösen. Mit Regex kann man nur kontextfreie Grammatiken beschreiben, daher wäre die Lösung von timbeau die beste.
 
gut .. das RegEx hier die falsche wahl sind wurde ja nun eingehend erläutert ...

ich denke ich werds dann doch in richtung von tim versuchen ...

naja ... da dachte ich mal : yea ... mit RegEx kann man so viel machen ... und dann such ich mir genau den anwendungsfall raus bei dem man wunderschön demonstrieren kann das man mit RegEx zwar viel aber halt nicht alles lösen kann ...

trotzdem danke für den input


[ot]@Slater
wirklich viel besser ist der titel auch nicht -.-'
anstatt mal abzuwarten das ich das problem etwas näher erläuter gleich erstmal topic-titel ändern ... großes pommes[/ot]
 
naja ... da dachte ich mal : yea ... mit RegEx kann man so viel machen ...

Vieles kann man, manches macht einfach nicht mehr Sinn. Ich hab mal für was einen Parser JSP -> (valides) XML -> JSP gemacht, da war die Transformation eigentlich nur durch Regex Suchen geregelt, das war wirklich overkill. Da würde ich beim nächsten Mal auch irgendwie von Hand parsen...
 

Zurück
Oben