Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配精确字符和数字的正则表达式_Java_Regex_Java 8 - Fatal编程技术网

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

Java 匹配精确字符和数字的正则表达式,java,regex,java-8,Java,Regex,Java 8,我想匹配一个字符串,它可以是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{

我想匹配一个字符串,它可以是
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");
    }
 }
}
它不起作用。我得到的
名称无效


正确的方法是什么?

拆下外部方括号:

if(name.matches("[K][H][1-9][0-9]?")){

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

谈到优化:这里并不需要进行替换,因为您可以将其应用于
[0-9]
类,使其成为可选的<代码>?与前面子模式的0或1次匹配

另外请注意,如果您计划在字符类中添加更多选项,则
[K][H]
是有意义的,否则您最好使用

if(name.matches("KH[1-9][0-9]?")){


\d
是一个匹配数字的正则表达式。

您可以使用单个正则表达式

if(name.matches("KH(?:[1-9]\\d|[1-9])")) {

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

KH[1-9][0-9]?
这将匹配文字字符
KH
,后面是数字1到9,以及可选的另一个数字0到9-由以下合法字符串说明:

KH1
KH2
...
KH8
KH9
KH10
KH11
...
KH18
KH19
KH20
KH21
...
KH98
KH99

请出示您的输入。请检查问题。我对这个问题有些困惑。我们可以这样尝试吗?KH\d+@raghavendra我想不行。我们不能,因为OP已经定义他想要从1到99的整数值only@NarendraSisodia好的,明白了,谢谢,我想这些只是输入,你不能检查
KH1或KH2或。。。KH99
是的,因为他们只为
1
99
构建了它,而不是为
100
构建了它,我希望现在已经很清楚了。如果您仍有疑问,请随时发表评论。请注意(括号除外),我的意思是外部
[…]
中的
[
]
被Java正则表达式引擎忽略。现在非常清楚了。非常感谢。但我只能在5分钟后接受答案。@Rajkishan您的输出可以有这个KH100吗?@AvinashRaj:自从我打字以来,我甚至没有看其他答案。@FooF:如果您计划将正则表达式与
Matcher.find()
,或
replaceAll()
,或
split()
,您需要它们。。。。
KH1
KH2
...
KH8
KH9
KH10
KH11
...
KH18
KH19
KH20
KH21
...
KH98
KH99