我想匹配一个可以是 KH1
或 KH2
或 ... KH99
的字符串。
我做到了,
public class Test1 {
public static void main(String[] args) {
String name = "KH1";
if(name.matches("[[K][H][1-9][0-9]]") || name.matches("[[K][H][1-9]]")){
System.out.println("VALID NAME");
}else{
System.out.println("INVALID NAME");
}
}
}
它不起作用。我收到 INVALID NAME
。
正确的做法是什么?
最佳答案
移除外部方括号:
if(name.matches("[K][H][1-9][0-9]?")){
参见 IDEONE demo
问题是您将整个模式包含在一个具有外部 [...]
的字符类中,并且内部的所有符号(括号除外)都被视为单个文字符号,并且整个表达式只能匹配 1 个字符。
谈论优化:在这里交替并不是真正必要的,因为您可以应用 ?
quantifier到 [0-9]
类,使其成为可选的。 ?
匹配前面子模式的 0 次或 1 次出现。
另请注意,如果您打算向字符类中添加更多选项,[K][H]
是有意义的,否则您不妨使用
if(name.matches("KH[1-9][0-9]?")){
或
if(name.matches("KH[1-9]\\d?")){
\d
是一个 shorthand class匹配数字。
关于java - 匹配精确字符和数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32110592/