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