Java 命令行中的元字符

Java 命令行中的元字符,java,regex,string,command-line-arguments,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\d或java-Test“\d”调用时不执行。为什么 实际上,它甚至打印:\d,而不使用双反斜杠(\\d) 通过命令行提供的参数不只是字符串吗 我知道它不能引发编译器错误,因为命令

守则:

String s=“\d”

引发编译器错误,转义字符非法。好的,明白了

但守则:

class Test
{
public static void main(String[] args)
{
String s = args[0];
System.out.println(s);
}
}
使用命令
java-Test\d
java-Test“\d”
调用时不执行。为什么

实际上,它甚至打印:
\d
,而不使用双反斜杠(\\d)

通过命令行提供的参数不只是字符串吗

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

或者,一旦我们通过了编译阶段,字符串包含的内容就无关紧要了(因为代码被转换成字节码,整个代码结构都被改变了)?如果是,请有人详细说明


提前通知

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


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

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

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

通过命令行提供的参数不只是字符串吗

是的,它们是弦。字符串对象。那很好


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

(请注意,其他一些库(特别是正则表达式)也可能有自己的转义机制,但基本上如果您运行

java Foo \d
然后假设您的shell没有做任何有趣的事情(这取决于该shell!),那么您将得到一个两个字符的字符串:一个反斜杠后跟一个
d

通过命令行提供的参数不只是字符串吗

是的,它们是字符串。字符串对象。很好


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

(请注意,其他一些库(特别是正则表达式)也可能有自己的转义机制,但基本上如果您运行

java Foo \d

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

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

您可能还混淆了字符串文字(生成字符串的代码片段)和字符串(由一系列字符组成的值)

您希望将两个字符的字符串
\d
存储在变量
s
中。为此,需要构造一个适当的字符串文本

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

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

      您可能还混淆了字符串文字(生成字符串的代码片段)和字符串(由一系列字符组成的值)

      您希望将两个字符的字符串
      \d
      存储在变量
      s
      中。为此,需要构造一个适当的字符串文本

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

      我相信字符串中的非法转义字符只是一个编译器错误,不是吗?那么Java是否应该继续,确保它本身在运行时没有非法转义?它保护的是作为程序员的您,而不是作为用户的您。我相信字符串中的非法转义字符只是一个编译器错误,不是吗?所以不会va继续,确保它自己在运行时没有非法逃逸?它保护的是作为程序员的您,而不是作为用户的您。@polet:所以基本上可以归结为:“一旦我们通过了编译阶段,字符串包含的内容就无关紧要了”.right???@WickeD不是真的。你一直在操纵值“\d”。问题是,在Jav代码中,为了表示该值,语法需要转义,因此你必须写“\\d”。就字符串值而言,绝对没有区别!@polet:所以基本上可以归结为:“一旦我们通过了编译阶段,字符串包含的内容就无关紧要了”。对吗???@WickeD不是真的。您一直在操作值'\d'。问题是在Jav代码中,为了表示该值,语法需要转义,因此您必须编写“\\d”“.就字符串值而言,绝对没有区别!”转义是Java语言的一部分,而不是字符串对象的一部分。“请详细说明..什么是指成为字符串对象的一部分。@邪恶:我的意思是字符串只是一个字符序列。它没有转义序列的概念。转义是o部分