如何测试String是否包含字母和数字

时间:2012-07-18 02:23:01

标签: java regex

我需要一个满足这两个条件的正则表达式。

只有当一个String包含A-Z和0-9时,它才会真实。

这是我尝试过的:

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

它不起作用。

6 个答案:

答案 0 :(得分:21)

我怀疑下面的正则表达式会因为环顾四周而变慢,但无论如何都应该有效:

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

正则表达式断言字符串中某处有一个大写字母(?=.*[A-Z]),并断言字符串中某处有一个数字(?=.*[0-9]),然后检查所有字符是否都是字母字符或数字。

答案 1 :(得分:16)

如果使用两个单独的正则表达式,则更容易编写和读取:

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);
}

答案 2 :(得分: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);

答案 3 :(得分:3)

这可以解决您的问题:

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

但这是不可读的。我建议首先检查输入“^ [A-Z0-9] + $”,然后用“[AZ]”检查以确保它至少包含一个字母,然后用“[0-9]”检查以确保它包含至少一个数字。这样,您可以轻松添加新限制,代码将保持可读性。

答案 4 :(得分:1)

([A-Z].*[0-9]+)|([0-9].*[A-Z]+)怎么样?

答案 5 :(得分:0)

尝试使用(([[A-Z] + [0-9])|([0-9] + [A-Z])))。应该解决。