Rav*_*avi 5 java regex windows command-line-arguments
我正在阅读SCJP指南,并发现了以下问题,它看起来非常简单,对某些人来说可能很容易.但是,我真的很难找到解决方案.
import java.util.regex.*;
class study{
public static void main(String[] args) {
Pattern p = Pattern.compile(args[0]);
Matcher m = p.matcher(args[1]);
boolean b=false;
while(b=m.find()){
System.out.print(m.start()+" "+m.group());
}
}
}
Run Code Online (Sandbox Code Playgroud)
在那个问题中,给出了命令行参数
java study "\d*" ab34ef
Run Code Online (Sandbox Code Playgroud)
而且,说什么是输出,我的猜测是334或234,它就在那个选项中.但是,答案(在Windows上)是01234456.所以,我的第一个问题是如何?
现在,人们说,你为什么不尝试.然后,我会说,是的,我做到了.但是,就我而言,我的屏幕上没有任何输出.然后,我试图找出所有类型的输入及其值.

在上面的截图中,显示了第二个输出,当我包含System.out.print(args[0]+" "+args[1]);在main方法中时.
甚至,我改变了命令行
java study "\\d*" ab34ef
Run Code Online (Sandbox Code Playgroud)
然后,我没有得到任何输出.所以,任何人都要解释这一切.
输出==
java study "\d*" ab34ef
No output
java study "\\d*" ab34ef
No output
Run Code Online (Sandbox Code Playgroud)
然后我System.out.print(args[0]+" "+args[1]);在main方法中添加.
java study "\d*" ab34ef
\Document and Setting ab34ef
java study "\\d*" ab34ef
\\d* ab34ef
Run Code Online (Sandbox Code Playgroud)
注意:没有输出意味着它没有显示任何内容.
实际上发生的情况是,当您\d*作为命令行参数传递时,它被视为\d后跟*通配符。因此,该参数将被该目录中以 开头的所有文件替换\d。(这种行为发生在Windows。虽然我不知道Linux,因为我没有使用过它)。
因此,您没有传递正则表达式,而是传递以\din 开头的文件/目录名称到您的程序中。
尝试打印代码中的参数:-
System.out.println(args[0] + " : " + args[1]);
Run Code Online (Sandbox Code Playgroud)
这将为您提供一些以以下开头的文件/目录名称\d...
解决方法:-
如果您想传递正则表达式,可以使用变通方法。作为正则表达式传递" \d*",前面有一个空格,在您的代码中,使用args[0].trim()orargs[0].replace(" ", "");代替args[0]。
因此,将其称为:-
java Foo " \d*" ab34ef
Run Code Online (Sandbox Code Playgroud)
并将您的代码更改为:-
Pattern p = Pattern.compile(args[0].replace(" ", ""));
Matcher m = p.matcher(args[1]);
Run Code Online (Sandbox Code Playgroud)
这将为您完成这项工作。
现在这就是通过命令行传递正则表达式的问题。
至于为什么你会得到这个输出,请查看这个答案 - string-replaceall-strange-behaviour,这是关于类似的问题。您将会了解为什么会发生这种情况。