14

両方の条件を満たす正規表現が必要です。

文字列にAZと0-9の両方が含まれている場合にのみtrueが返されます。

これが私が試したことです:

if PNo[0].matches("^[A-Z0-9]+$")

それは動作しません。

4

7 に答える 7

25

以下の正規表現は、ルックアラウンドによって速度が低下していると思われますが、関係なく動作するはずです。

.matches("^(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]+$")

正規表現は、文字列のどこかに大文字のアルファベット文字がある(?=.*[A-Z])ことをアサートし、文字列のどこかに数字があることをアサートし、(?=.*[0-9])すべてがアルファベット文字か数字かをチェックします。

于 2012-07-18T02:33:55.863 に答える
21

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);
}
于 2012-07-18T02:37:20.433 に答える
7

文字は数字の前でも後でもよいので、この式は機能するはずです。

(([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);
于 2012-07-18T02:27:41.657 に答える
5

これで問題が解決するはずです:

^([A-Z]+[0-9][A-Z0-9]*)|([0-9]+[A-Z][A-Z0-9]*)$

しかし、それは読めません。最初に「^[A-Z0-9]+$」で入力をチェックし、次に「[AZ]」でチェックして少なくとも 1 つの文字が含まれていることを確認し、「[0-9]」でチェックしてそれを確認することをお勧めします。少なくとも 1 つの数字が含まれています。このようにして、新しい制限を簡単に追加でき、コードは読みやすいままになります。

于 2012-07-18T02:28:20.147 に答える
1

どう([A-Z].*[0-9]+)|([0-9].*[A-Z]+)ですか?

于 2012-07-18T02:28:18.443 に答える
0

(([AZ]+[0-9])|([0-9]+[AZ])) を使用してみてください。解決するはずです。

于 2019-04-29T13:42:09.600 に答える