両方の条件を満たす正規表現が必要です。
文字列にAZと0-9の両方が含まれている場合にのみtrueが返されます。
これが私が試したことです:
if PNo[0].matches("^[A-Z0-9]+$")
それは動作しません。
以下の正規表現は、ルックアラウンドによって速度が低下していると思われますが、関係なく動作するはずです。
.matches("^(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]+$")
正規表現は、文字列のどこかに大文字のアルファベット文字がある(?=.*[A-Z])
ことをアサートし、文字列のどこかに数字があることをアサートし、(?=.*[0-9])
すべてがアルファベット文字か数字かをチェックします。
2 つの別々の正規表現を使用すると、読み書きが簡単になります。
String s = "blah-FOO-test-1-2-3";
String numRegex = ".*[0-9].*";
String alphaRegex = ".*[A-Z].*";
if (s.matches(numRegex) && s.matches(alphaRegex)) {
System.out.println("Valid: " + input);
}
いっそのこと、メソッドを書いてください:
public boolean isValid(String s) {
String n = ".*[0-9].*";
String a = ".*[A-Z].*";
return s.matches(n) && s.matches(a);
}
文字は数字の前でも後でもよいので、この式は機能するはずです。
(([A-Z].*[0-9])|([0-9].*[A-Z]))
この式を使用するコード例を次に示します。
Pattern p = Pattern.compile("(([A-Z].*[0-9])|([0-9].*[A-Z]))");
Matcher m = p.matcher("AXD123");
boolean b = m.find();
System.out.println(b);
これで問題が解決するはずです:
^([A-Z]+[0-9][A-Z0-9]*)|([0-9]+[A-Z][A-Z0-9]*)$
しかし、それは読めません。最初に「^[A-Z0-9]+$」で入力をチェックし、次に「[AZ]」でチェックして少なくとも 1 つの文字が含まれていることを確認し、「[0-9]」でチェックしてそれを確認することをお勧めします。少なくとも 1 つの数字が含まれています。このようにして、新しい制限を簡単に追加でき、コードは読みやすいままになります。
どう([A-Z].*[0-9]+)|([0-9].*[A-Z]+)
ですか?
(([AZ]+[0-9])|([0-9]+[AZ])) を使用してみてください。解決するはずです。