[英]Regular Expression to Match Exact Character and Numbers
我想匹配一个字符串,可以是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演示
问题是你将整个模式包含在带有[...]
的字符类中,并且里面的所有符号(括号除外)都被视为单个文字符号,整个表达式只能匹配1个字符。
谈论优化:由于您可以申请,因此此处不一定需要更改?
量化到[0-9]
类以使其可选。 ?
匹配前一个子模式的0或1次出现。
另请注意,如果您计划在字符类中添加更多选项, [K][H]
是有意义的,否则您也可以使用
if(name.matches("KH[1-9][0-9]?")){
要么
if(name.matches("KH[1-9]\\d?")){
\\d
是一个匹配数字的速记类 。
首先,那些外方括号是不正确的。 删除它们。 其次,你的正则表达式可以简化很多 。 您不需要两个单独的表达式,也不需要在字符类中包含单个字符K
和H
尝试:
KH[1-9][0-9]?
这将匹配文字字符KH
,后跟数字1到9,以及可选的另一个数字0到9 - 由以下合法字符串说明:
KH1
KH2
...
KH8
KH9
KH10
KH11
...
KH18
KH19
KH20
KH21
...
KH98
KH99
您可以使用单个正则表达式。
if(name.matches("KH(?:[1-9]\\d|[1-9])")) {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.