我想匹配一个字符串,该字符串可以是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
。
这是正确的方法吗?
答案 0 :(得分:10)
删除外方括号:
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
是与{s}匹配的shorthand class。
答案 1 :(得分:4)
首先,那些外方括号不正确。删除它们。其次,您的正则表达式可以简化很多。您不需要两个单独的表达式,也不需要在字符类中包含单个字符K
和H
。尝试:
KH[1-9][0-9]?
这将匹配文字字符KH
,后跟数字1到9,以及可选的另一个数字0到9 - 由以下合法字符串说明:
KH1
KH2
...
KH8
KH9
KH10
KH11
...
KH18
KH19
KH20
KH21
...
KH98
KH99
答案 2 :(得分:3)
您可以使用单个正则表达式。
if(name.matches("KH(?:[1-9]\\d|[1-9])")) {