Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 - Fatal编程技术网

java中正则表达式的模式匹配和范围检查

java中正则表达式的模式匹配和范围检查,java,regex,Java,Regex,我的应用程序基本上通过main(String[]args)方法接受用户输入。我一直在想办法用模式匹配器对输入进行检查 每个有效输入基本上由一个单个字符组成(空白应忽略) 如果用户输入无效-这意味着如果我们检测到与上述内容不同的内容,则应用程序将在显示错误消息后退出 因此,主方法中的所有逻辑都将在一个大条件中: if(Pattern.matches("[RQrq1-6]*", args[0]){ } 我很难掌握涉及regex的matches方法(上述方法不起作用),我希望避免使用多个if-el

我的应用程序基本上通过main(String[]args)方法接受用户输入。我一直在想办法用模式匹配器对输入进行检查

每个有效输入基本上由一个单个字符组成(空白应忽略)

如果用户输入无效-这意味着如果我们检测到与上述内容不同的内容,则应用程序将在显示错误消息后退出

因此,主方法中的所有逻辑都将在一个大条件中:

if(Pattern.matches("[RQrq1-6]*", args[0]){

}
我很难掌握涉及regex的matches方法(上述方法不起作用),我希望避免使用多个if-else条件来单独检查每个有效输入

这可以通过同时进行范围检查的模式匹配器实现吗

谢谢你的提示

我不想用regexp做这件事,因为它只会匹配和提取特定的模式,而不会真正帮助决定对特定字符串做什么(使用一个regexp)

相反,我将签出一个命令行选项库,如。它更适合您的需要。

我不想用regexp来做这件事,因为它只会匹配和提取特定的模式,而不会真正帮助您决定对特定字符串做什么(使用一个regexp)


相反,我将签出一个命令行选项库,如。它更适合您的需要。

我认为您需要匹配传入的每个参数。因此:

for(int i = 0; i < args.length; i++) {
   if (Pattern.matches("[RQrq1-6]+", args[i]){
     <do stuff>
   }
}
for(int i=0;i
我认为您需要匹配传入的每个参数。因此:

for(int i = 0; i < args.length; i++) {
   if (Pattern.matches("[RQrq1-6]+", args[i]){
     <do stuff>
   }
}
for(int i=0;i
以下课程对我来说很好(正如我所期望的那样):

例如:

burner@firefighter:~$ java Test rr
OK: rr
burner@firefighter:~$ java Test rrRR
OK: rrRR
burner@firefighter:~$ java Test rrRRa
Not OK: rrRRa
现在,您可能正在尝试匹配命令行上的所有字符。命令解释器会在启动应用程序之前将这些字符分离为单独的字符串。您可以按照Myles的建议进行操作,但在检测到错误输入之前,您将处理一些命令。您可以这样做:

String myargs = "";
for (String arg : args) {
  myargs += arg;
}
if(java.util.regex.Pattern.matches("[RQrq1-6]*", myargs)){
...

下面的课程对我来说很好(正如我所期望的那样):

例如:

burner@firefighter:~$ java Test rr
OK: rr
burner@firefighter:~$ java Test rrRR
OK: rrRR
burner@firefighter:~$ java Test rrRRa
Not OK: rrRRa
现在,您可能正在尝试匹配命令行上的所有字符。命令解释器会在启动应用程序之前将这些字符分离为单独的字符串。您可以按照Myles的建议进行操作,但在检测到错误输入之前,您将处理一些命令。您可以这样做:

String myargs = "";
for (String arg : args) {
  myargs += arg;
}
if(java.util.regex.Pattern.matches("[RQrq1-6]*", myargs)){
...

你的正则表达式不太正确

编写时:
[RQrq1-6]*

你是说匹配方括号中任何字符的零次或多次重复

试试这个
[RQrq1-6]
-这意味着只匹配一个

我写了一个小“spike”程序:

}

结果如下:

Q match
q match
z fail
Z fail
R match
r match
0 fail
1 match
2 match
3 match
4 match
5 match
6 match
7 fail
02 fail
11 match
17 fail
 match
删除正则表达式中的星号后:

Q match
q match
z fail
Z fail
R match
r match
0 fail
1 match
2 match
3 match
4 match
5 match
6 match
7 fail
02 fail
11 fail
17 fail
 fail
如何忽略空白

替换此版本的testit:

public static void testIt(String sample) {
    System.out.print(sample+" ");

    Pattern pattern = Pattern.compile("\\s*([RQrq1-6])\\s*");
    Matcher matcher = pattern.matcher(sample);

    if (matcher.matches()) {
        System.out.println("match '"+matcher.group(1)+"'");
    } else {
        System.out.println("fail");
    }
}
以下是输出的关键行:

testIt(" 6");// ignore space tests
testIt(" 7");// ignore space tests
testIt("6 ");// ignore space tests
testIt("7 ");// ignore space tests

    6 match '6'
    7 fail
   6  match '6'
   7  fail

它使用了一个称为“捕获组”的概念。捕获组是正则表达式的一部分,它被分配了一个数字,以便提取匹配的特定符号字符串。我们在这里使用捕获组将符号从可选空白中提取出来。

您的正则表达式不太正确

编写时:
[RQrq1-6]*

你是说匹配方括号中任何字符的零次或多次重复

试试这个
[RQrq1-6]
-这意味着只匹配一个

我写了一个小“spike”程序:

}

结果如下:

Q match
q match
z fail
Z fail
R match
r match
0 fail
1 match
2 match
3 match
4 match
5 match
6 match
7 fail
02 fail
11 match
17 fail
 match
删除正则表达式中的星号后:

Q match
q match
z fail
Z fail
R match
r match
0 fail
1 match
2 match
3 match
4 match
5 match
6 match
7 fail
02 fail
11 fail
17 fail
 fail
如何忽略空白

替换此版本的testit:

public static void testIt(String sample) {
    System.out.print(sample+" ");

    Pattern pattern = Pattern.compile("\\s*([RQrq1-6])\\s*");
    Matcher matcher = pattern.matcher(sample);

    if (matcher.matches()) {
        System.out.println("match '"+matcher.group(1)+"'");
    } else {
        System.out.println("fail");
    }
}
以下是输出的关键行:

testIt(" 6");// ignore space tests
testIt(" 7");// ignore space tests
testIt("6 ");// ignore space tests
testIt("7 ");// ignore space tests

    6 match '6'
    7 fail
   6  match '6'
   7  fail

它使用了一个称为“捕获组”的概念。捕获组是正则表达式的一部分,它被分配了一个数字,以便提取匹配的特定符号字符串。我们在这里使用捕获组从可选空白中提取符号。

如果我没有看错您的问题,您想这样调用您的程序:

$ myprog 153r34r2q $myprog 153r34r2q 然后,您的程序遍历该字符串的单字母命令并执行它们(可能是为了在进一步的参数中传递的内容)

因此,您的正则表达式解决方案几乎可以(使用
/[RrQq1-6]+/
而不是
/[RrQq1-6]*/

但是,我怀疑您实际上希望运行程序,然后在程序运行时接受用户命令(这种假设是由命令名“replay”和“quit”引起的,否则没有多大意义)。为此,
args[]
根本不适合。相反,您必须使用一个主循环,它接受单个按键作为输入。在这种情况下,我不会使用正则表达式来测试单个字符,而是使用switch子句来分派到具有默认大小写的不同命令,以捕获无效输入


编辑:在阅读了您的评论之后,我建议您可能希望在整个过程中使用一些东西。

如果我正确地阅读了您的问题,您希望这样调用您的程序:

$ myprog 153r34r2q $myprog 153r34r2q 然后,您的程序遍历该字符串的单字母命令并执行它们(可能是为了在进一步的参数中传递的内容)

因此,您的正则表达式解决方案几乎可以(使用
/[RrQq1-6]+/
而不是
/[RrQq1-6]*/

但是,我怀疑您实际上想要运行程序,然后在程序运行时接受用户命令(这种假设是由命令名“replay”和“quit”引起的,否则没有多大意义)。因此,
args[]
根本不适合。相反,您必须