2016-05-01 5 views
0

Ich versuche, einen regulären Ausdruck zu zaubern zu überprüfen, ob ein bestimmtes Kennwort enthält: 1. ein Großbuchstaben 2. a Kleinbuchstaben 3. eine Reihe 4 . mindestens 8 Zeichen langJava RE-Klasse - Look-Ahead (implementierende Passwort Validator)

fand ich die folgenden regex solche Einschränkungen zu definieren:

RE r = new RE("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\[email protected]$!%*#?&]{8,}$"); 

Leider i auf ein Legacy-System beschränkt bin, dass die Java-Klasse verwendet org.apache.regexp.RE.

ohne Look-Ahead, ich war in der Lage Regeln zu definieren 1-3 als die folgenden regex: „=“

RE r = new RE("^(((.*([A-Z]+).*([0-9]+).*|.*([0-9]+).*([A-Z]+)).*)$)") 

, aber ich weiß nicht, wie die Längenparameter auf diese Zeichenfolge hinzuzufügen, ohne die Meta-Zeichen.

versuchen, zu kompilieren "(= ...?)" Schlägt mit dem folgenden Fehler:

org.apache.regexp.RESyntaxException: Syntax error: Missing operand to closure 
    at org.apache.regexp.RECompiler.syntaxError(Unknown Source) 
    at org.apache.regexp.RECompiler.terminal(Unknown Source) 
    at org.apache.regexp.RECompiler.closure(Unknown Source) 
    at org.apache.regexp.RECompiler.branch(Unknown Source) 
    at org.apache.regexp.RECompiler.expr(Unknown Source) 
    at org.apache.regexp.RECompiler.terminal(Unknown Source) 
    at org.apache.regexp.RECompiler.closure(Unknown Source) 
    at org.apache.regexp.RECompiler.branch(Unknown Source) 
    at org.apache.regexp.RECompiler.expr(Unknown Source) 
    at org.apache.regexp.RECompiler.compile(Unknown Source) 
    at org.apache.regexp.RE.<init>(Unknown Source) 
    at org.apache.regexp.RE.<init>(Unknown Source) 
    at com.idit.hscx.passwordTest.testPassword(passwordTest.java:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

meine Frage: ist "Look-Ahead" existiert in der Klasse RE? Wenn nicht, wie implementiere ich den Operator "AND" in RE class regex?

danke!

+0

Wenn es so viele Einschränkungen gibt, verwenden Sie einfach die Existenz dieser Zeichen überprüfen – rock321987

+0

Verwenden Sie einfach zwei Regexe. Es gibt keinen Grund, nur einen zu benötigen. – Laurel

+0

Zwei Fragen: Q1 Was passiert, wenn Sie einen Lookahead mit einer festen Anzahl von Zeichen wie '^ (? =. {0,8} [az])' oder '^ (? =.? .?.?.?.?.?.?.? [az]) 'anstelle des unendlichen'. *? '. Q2 Was passiert, wenn Sie einen Lookbehind wie '(? <= [Az]. {0,8}) $' oder '(? <= [Az].?.?.?.?.?.?...?. ?) $ '. Ich frage, weil Java die unendlichen Lookarounds nicht wirklich mag. –

Antwort

0

Der zweite Ausdruck, den Sie aufgelistet haben, testet nur für 2 der 4 Bedingungen. Es sucht nur nach Großbuchstaben und Zahlen.

Ich kann mir ein paar Möglichkeiten vorstellen, dies zu tun.

Zunächst gibt es sechs verschiedene Kombinationen aus Großbuchstaben, Kleinbuchstaben und Zahlen.

  • ULN
  • UNL
  • LUN
  • LNU
  • NLU
  • NUL

Plan A

Verwenden Sie zwei Regex Ausdrücke. Der erste Ausdruck würde bestätigen, dass in Ihrer Zeichenfolge mindestens einer von jedem Zeichentyp vorhanden ist. Es ist ein bisschen lang, weil es nach jeder der sechs Kombinationen sucht.

^.*?(?:[A-Z]+.*?[a-z]+.*?[0-9]|[A-Z]+.*?[0-9]+.*?[a-z]|[a-z]+.*?[A-Z]+.*?[0-9]|[a-z]+.*?[0-9]+.*?[A-Z]|[0-9]+.*?[a-z]+.*?[A-Z]|[0-9]+.*?[A-Z]+.*?[a-z])

Der zweite Test entweder ein regulärer Ausdruck oder ein String-Länge Test sein könnte. Die Regex würde wie folgt aussehen:

^.{8,}

Plan B

Wäre eine viel komplexere regulären Ausdruck zu konstruieren, die die verschiedenen Kombinationen von Groß-, Kleinbuchstaben und Zahlen in jeder Position testen würde. Diese Regex wäre natürlich enorm.

+0

Tnx Ro. Ich werde den ersten Vorschlag umsetzen, denke ich .... – rotemsith