我需要一个满足这两个条件的正则表达式。
只有当一个String包含A-Z和0-9时,它才会真实。
这是我尝试过的:
if PNo[0].matches("^[A-Z0-9]+$")
它不起作用。
答案 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])))。应该解决。