2

新しいパスワードに一致する正規表現を作成しようとしています(これは機能します)が、100%機能させるための最後のステップのみが必要です。

これがRegExpとそれが想定していることです:

((?=.*(\\d|[\\(\\)\\{\\}\\?!\\$&\\*%\\=\\+_\\-\\.]))(?=.*[a-z])(?=.*[A-Z]).{8,})

RegExpによると:数字または記号(){}?!$&%*=+-.を使用する必要があります-数字と記号の両方を挿入できるため、OR演算子は機能しません-少なくとも1つの小文字、少なくとも1つの大文字、および8文字の最小長。

OR演算子をいくつかの方法で使用しようとしましたが|、機能させることができません。

私は何が欠けていますか?事前にどうもありがとうございました。

注:パスワードポリシーのliferay構成ファイル内でこの正規表現を使用しています。

4

4 に答える 4

3

ORではなくXOR論理演算が必要です。

OR is true:
A |  B |  o/p
T |  T |   T
F |  T |   T
T |  F |   T
F |  F |   F

XOR is true:
A |  B | o/p
T |  T |  F
F |  T |  T
T |  F |  T
F |  F |  F

排他的論理和または正規表現

于 2012-07-12T16:23:37.543 に答える
3

わかりました、私はあなたの表現を少し書き直しました、これは私が思いついたものです:

String pattern = "^(?=.*[\\d().{}?!$&*%=+_-])(?=.*[a-z])(?=.*[A-Z]).{8,}$";

これは、

  • 少なくとも1つの数字または特殊文字
  • 少なくとも1つの小文字
  • 少なくとも1つの大文字
  • 少なくとも8文字の長さです
于 2012-07-12T16:54:42.967 に答える
2

正規表現はおそらくこれを行うことができますが、次のような複数の正規表現テストを使用する方が簡単で安全だと思います。

boolean containsDigit = Pattern.matches("[0-9]", testString);
boolean containsSymbol = Pattern.matches("[(){}?!$&%*=+.-]", testString);
boolean containsLowercase = Pattern.matches("[a-z]", testString);
boolean containsUppercase = Pattern.matches("[A-Z]", testString);

if(testString.length() >= 8
        && containsLowercase
        && containsUppercase
        && (containsDigit || containsSymbol)
        && !(containsDigit && containsSymbol)) {
    //valid
} else {
    //invalid
}

私は数か月前にJava正規表現パターンを使用していましたが、これはそれほど複雑ではありませんでしたが、Javaのバグが明らかになりました。括弧で囲まれた句が多すぎると問題が発生したようで、パターンをより単純なものに分割する必要がありました。

上記は、複数節の正規表現パターンよりもはるかに読みやすいため、保守とデバッグが容易です。

于 2012-07-12T19:20:41.503 に答える
1

あなたが言った、

数字と記号の両方を挿入できます

これは、論理OR演算では正常です。あなたが望むものは排他的論理和または(XOR)のように聞こえます。正規表現でそれをどのように行うかはわかりませんが、これが正しい方向を示すことを願っています。

于 2012-07-12T16:24:58.393 に答える