2016-05-01 6 views
0

私は与えられたパスワードが含まれていることを検証する正規表現を想起しようとしている: 1.大文字 2.小文字 3.数 4を。残念ながら、私はJavaのorg.apache.regexp.REクラスを使用する従来のシステムに限定していJavaのREクラス - 先読み(パスワードのバリデータを実装する)

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

8文字以上では、私はそのような制約を定義するには、次の正規表現を見つけました。

は先読みなしに、私は、次の正規表現として1-3のルールを定義することができた:「?=」

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

が、私は使用しなくても、この文字列に長さパラメータを追加する方法がわかりませんメタキャラクター。

コンパイルしようとしている "(?= ...)" 次のエラーで失敗します。

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) 

私の質問: は "先読み" はクラスREに存在しているのですか? そうでなければ、どのようにREクラスの正規表現で "AND"演算子を実装しますか?

ありがとうございました!

+0

制限がある場合は、それらの文字の存在を単純にチェックしてください。 – rock321987

+0

2つの正規表現を使用してください。ただ1つだけ必要な理由はありません – Laurel

+0

2つの質問:Q1 '^(?=。{0,8} [az])'や '^(?=。?)のような固定数の文字で先読みを使うとどうなりますか?無限の '。*?'の代わりに '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Q2 '(?<= [az]。{0,8})$'や '(?<= [az]。?。?。?。?)のようなlookbehindを使うとどうなりますか? ?)$ '。私はjavaが本当に無限のlookaroundsを好まないので頼む。 –

答えて

0

リストされた2番目の表現は、4つの条件のうち2つの条件のテストのみです。大文字と数字のみを検索します。

私はこれを行うにはいくつかの方法が考えられます。

まず、大文字、小文字、および数字の6つの異なる組み合わせがあります。

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

プランA

を使用して、2つの正規表現の表現。最初の式は、文字列に各文字型が少なくとも1つ存在することを検証します。 6つの組み合わせのそれぞれを探すので、ちょっとです。

^.*?(?:[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])

第二の試験は、正規表現または文字列の長さの試験のいずれかであり得ます。

がそれぞれの位置に大文字、小文字と数字のすべてのさまざまな組み合わせをテストするだろうはるかに複雑な正規表現を構築することです

^.{8,}

プランB:正規表現は次のようになります。この正規表現は自然に膨大なものになります。

+0

Tnx Ro。私は1番目の提案を実装する、私は思う.... – rotemsith

関連する問題