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

Raj*_*ami 7 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");
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的.我得到INVALID NAME.

这是正确的方法是什么?

Wik*_*żew 10

删除外方括号:

if(name.matches("[K][H][1-9][0-9]?")){
Run Code Online (Sandbox Code Playgroud)

请参阅IDEONE演示

问题是您将整个模式包含在带有outer的字符类中[...],并且内部的所有符号(括号除外)都被视为单个文字符号,整个表达式只能匹配1个字符.

谈论优化:这里不需要交替,因为您可以将?量词应用于[0-9]类以使其成为可选项.?匹配前一个子模式的0或1次出现.

另请注意,[K][H]如果您计划在字符类中添加更多选项,则有意义,否则您也可以使用

if(name.matches("KH[1-9][0-9]?")){
Run Code Online (Sandbox Code Playgroud)

要么

if(name.matches("KH[1-9]\\d?")){
Run Code Online (Sandbox Code Playgroud)

\d是一个匹配数字的速记类.

  • @AvinashRaj:自打字以来,我甚至没有看其他答案. (2认同)