命令行中的元字符

时间:2012-05-24 17:52:20

标签: java regex string command-line-arguments

代码:

String s = "\d";

引发编译错误,非法转义字符。好好理解!!

但是代码:

class Test
{
public static void main(String[] args)
{
String s = args[0];
System.out.println(s);
}
}
使用命令java Test \djava Test "\d"调用

时不会。为什么?

事实上它甚至打印:\d而不使用双反斜杠(“\\ d”)。

通过命令行提供的参数不仅仅被视为字符串吗?

我知道它不能引发编译器错误,因为命令行提供的参数在编译阶段后是但是它不应该引发运行时异常或其他什么?

或者说,一旦我们通过编译阶段,它包含什么并不重要(因为代码是以字节码转换的,整个代码结构都被改变了)?如果是,那么有人可以详细说明。

Thnx提前!!

3 个答案:

答案 0 :(得分:2)

加倍的后退只是语法问题。在Java代码中,要在引号内表示单个反斜杠,必须键入两次。然而,你真正代表的是一个反斜杠。

当您通过命令行传递它时,您不需要转义,因为它不是Java代码。

答案 1 :(得分:1)

  

通过命令行提供的参数不仅仅被视为字符串吗?

是的,他们是字符串。字符串对象。没关系。

但是,在代码中,您有字符串文字。这些由Java编译器解析,以在执行时生成String 对象。转义是Java语言的一部分,不是 String对象的一部分。

(请注意,其他一些库 - 特别是正则表达式 - 可能有自己的转义机制,但从根本上说如果你运行

java Foo \d

然后假设你的 shell 没有做任何有趣的事情(这将取决于那个shell!)然后你最终得到一个两个字符的字符串:反斜杠后跟d

答案 2 :(得分:1)

您没有意识到shell命令行和Java是两种不同的语言。给shell的命令行被解析为shell命令。授予java的Java程序被解析为Java。

您可能还会混淆字符串文字(产生字符串的代码片段)和字符串(由字符序列组成的值)。

您希望将两个字符字符串 \d存储在变量s中。您需要构建一个适当的字符串文字才能做到这一点。

  • 要生成两个字符串\d,可以使用cmd(Windows shell)字符串文字\d
  • 要生成两个字符串\d,可以使用Java字符串文字"\\d"