我需要一个满足这两个条件的正则表达式。
只有当一个字符串同时包含 AZ 和 0-9 时,它才应该给我真实的。
这是我尝试过的:
if PNo[0].matches("^[A-Z0-9]+$")
这没用。
我怀疑下面的正则表达式会因环视而减慢,但无论如何它都应该起作用:
.matches("^(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]+$")
正则表达式断言字符串中某处有一个大写字母字符(?=.*[A-Z])
,并断言字符串(?=.*[0-9])
某处有一个数字,然后它检查所有内容是字母字符还是数字。
如果您使用两个单独的正则表达式,则更容易编写和阅读:
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);
基本:
匹配字符串的当前行:.
匹配 0 或任意数量的任意字符:*
匹配当前行中的任何内容:.*
匹配字符集(范围)中的任何字符:[start-end]
匹配组中的一个正则表达式:(regex1|regex2|regex3)
注意 start 和 end 来自 ASCII 顺序,并且 start 必须在 end 之前。比如你可以做[0-Z]
,但不能[Z-0]
。这是供您参考的ASCII图表
根据正则表达式检查字符串
只需调用yourString.matches(theRegexAsString)
检查字符串是否包含字母:
检查是否有字母:yourString.matches(".*[a-zA-Z].*")
检查是否有小写字母:yourString.matches(".*[a-z].*")
检查是否有大写字母:yourString.matches(".*[A-Z].*")
检查字符串是否包含数字:
yourString.matches(".*[0-9].*")
检查字符串是否同时包含数字和字母:
最简单的方法是用字母和数字匹配两次
yourString.matches(".*[a-zA-Z].*") && yourString.matches(".*[0-9].*")
如果您希望将所有内容都匹配在一起,则正则表达式将类似于:匹配在某个地方有一个字符的字符串,然后在任何位置都有一个数字,或者反过来。所以你的正则表达式将是:
yourString.matches(".*([a-zA-Z].*[0-9]|[0-9].*[a-zA-Z]).*")
检查字符串是否带有字母
yourString.matches("[a-zA-Z].*")
检查字符串是否以数字结尾
yourString.matches(".*[0-9]")
这应该可以解决您的问题:
^([A-Z]+[0-9][A-Z0-9]*)|([0-9]+[A-Z][A-Z0-9]*)$
但它是不可读的。我建议先用“^[A-Z0-9]+$”检查输入,然后用“[AZ]”检查以确保它至少包含一个字母,然后用“[0-9]”检查以确保它至少包含一位数字。通过这种方式,您可以轻松添加新的限制,并且代码将保持可读性。
怎么样([A-Z].*[0-9]+)|([0-9].*[A-Z]+)
?
尝试使用 (([AZ]+[0-9])|([0-9]+[AZ])) 。它应该可以解决。