正则表达式匹配精确的字符和数字

时间:2015-08-20 06:00:19

标签: java regex java-8

我想匹配一个字符串,该字符串可以是KH1KH2或...... 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

这是正确的方法吗?

3 个答案:

答案 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)

首先,那些外方括号不正确。删除它们。其次,您的正则表达式可以简化很多。您不需要两个单独的表达式,也不需要在字符类中包含单个字符KH。尝试:

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])")) {