在Windows上的args []数组中传递转义序列

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)

而且,说什么是输出,我的猜测是334234,它就在那个选项中.但是,答案(在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)

注意:没有输出意味着它没有显示任何内容.

Roh*_*ain 4

实际上发生的情况是,当您\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,这是关于类似的问题。您将会了解为什么会发生这种情况。