繁体   English   中英

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

[英]Regular Expression to Match Exact Character and Numbers

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

这是正确的方法是什么?

删除外方括号:

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是一个匹配数字的速记类

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM