我想匹配的字符串可以是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");
}
}
}
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是一个匹配数字的速记类.