あなたは
^(?=[^A-Z]*[A-Z][^A-Z]*$)(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$
はregex demo(ビットは複数行入力が原因で変更された)を参照してください使用することができます。 Javaでは、二重バックスラッシュを使用することを忘れないでください(数字を一致させるには\\d
など)。ここ
は故障である:
^
- 文字列の先頭(なしマルチラインフラグがないと仮定すると、使用される)
(?=[^A-Z]*[A-Z][^A-Z]*$)
- のみ1大文字が存在するかどうかを確認(任意のUnicodeと一致する\p{Lu}
を使用します
(?=[^a-z]*[a-z][^a-z]*$)
- 小文字が1つしかない場合は同様にチェックしてください(あるいは、\p{Ll}
と\P{Ll}
をUnicode文字にマッチさせてください)
(?=(?:\D*\d){6}\D*$)
- 文字列の先頭から6桁の数字を確認してください(=文字列の先頭から0桁以上の数字は使用できません。\D
は任意の文字に一致しますが、[^0-9]
に置き換えることもできます) 、次に数字(\d
)続いて、次に文字列の末尾($
)まで0以上の数字以外の文字(\D*
)が続く)、次いで
[a-zA-Z0-9]{8}
- 丁度8英数字文字と一致。
$
- 文字列の最後。
ロジックに続いて、私たちも、ちょうど
^(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$
一つ我々は唯一[a-zA-Z0-9]
と小文字と大文字と数字を許可するなどの条件を除去することができる、と私たちは2つの条件適用するときにこれを削減することができますがの文字列(この場合は1文字は大文字である必要があります)と一致すると自動的に3番目の文字が実行されます。
のJava matches()
方法でそれを使用して、開始とパターンの最後に^
と$
アンカーを使用する必要はありませんが、あなたはまだ先読みして、それを必要とする:
String s = "K82v6686";
String rx = "(?=[^a-z]*[a-z][^a-z]*$)" + // 1 lowercase letter check
"(?=(?:\\D*\\d){6}\\D*$)" + // 6 digits check
"[a-zA-Z0-9]{8}"; // matching 8 alphanum chars exactly
if (s.matches(rx)) {
System.out.println("Valid");
}
あなたはどちらのエンジンを使用していますか?正規表現を複数のテストに分割することは可能ですか?すなわち、文字とは別に2文字の正確な文字が含まれていますか? –
私はJava 8を使用しています。文字と数字はどこでもかまいません。ちょうど6桁、正確に1つの大文字、正確に1つの小文字が重要です。彼らがどこに位置しているかは問題ではありません。 – NoelAramis
私はおそらく(正規表現なし)これをチェックするための短い方法を書いています。それははるかに理解し、維持することがより簡単になります。 – Henry