【问题标题】:Java String vs. Command Line ArgumentJava 字符串与命令行参数
【发布时间】:2012-06-17 01:54:28
【问题描述】:

为什么传递给 Java 类的命令行参数似乎被自动转义了,而在实例化的 String 对象中,转义字符 () 似乎被忽略了。

例如,如果以这样的字符串开头:

SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'

我尝试通过这样一个简单的类来运行它:

public class EscapeTest {
    public static void main (String[] args) {
        String str = "SELECT * FROM my_table WHERE " 
                     + "my_col like 'ABC_\' ESCAPE '\'";
        System.out.println("ARGS[0]: "+args[0]);
        System.out.println("STR: "+str);
}
}

我将上面的“SELECT”语句作为命令行参数传递,我得到如下输出:

ARGS[0]: SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'

STR: SELECT * FROM my_table WHERE my_col like 'ABC_' ESCAPE ''

如果我在 Eclipse 调试器中查看 ARGS[0] 的值,我会发现斜杠已被转义。为什么会这样?让我觉得有点难以预测。

【问题讨论】:

    标签: java string command-line-arguments backslash


    【解决方案1】:

    您的字符串str 的内容不包含任何反斜杠。这些是由理解 Java 字符串文字的转义序列的 Java 编译器处理的。

    命令行处理器可能没有这样做 - 它没有以任何方式特别处理反斜杠,尽管这取决于你的 shell。 (在大多数 Unix shell 中,它以不同的方式处理反斜杠。我猜你是在 Windows 上。)

    所以,你的命令行参数确实有反斜杠。它们没有被正在执行的Java进程转义——它们只是在字符串中的“那里”。

    现在听起来 调试器 在向您显示字符串时正在转义字符串,以便您可以看到制表符和换行符之类的内容。重要的是要了解这只是调试器显示字符串的方式 - Java 字符串本身没有“转义”之类的东西。

    编辑:根据评论:

    要在 Java 源代码中表达这个字符串,你必须对反斜杠进行转义:

    String str = "SELECT * FROM my_table WHERE my_col like 'ABC_\\' ESCAPE '\\'"; 
    

    反斜杠必须被转义,因为反斜杠是 Java 字符串文字中的转义字符。

    【讨论】:

    • 为了澄清您的正确答案:要在 Java 源代码中表达此字符串,您确实必须编写:String str = "SELECT * FROM my_table WHERE my_col like 'ABC_\\' ESCAPE '\\'"; 必须转义反斜杠,因为它们是 Java 源字符串文字中的转义字符。
    • 我实际上是在 Mac 上运行它,所以是 Unix。在 Eclipse 中运行并从终端(unix CLI)产生相同的结果。我了解在 Java 源代码中的 String 实例化中转义转义字符,我只是试图显示一对一的比较。
    • @Jason:如果您在终端中运行,我希望 shell 能够将反斜杠视为转义字符。你能显示你的 exact 命令行吗? (在 Eclipse 中运行我可以理解有所不同。)
    • @Jon:这是我的确切命令行:java org.jason.string.EscapeTest "SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'"
    • @Jon:这里是确切的命令行java org.jason.string.EscapeTest "SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'"
    猜你喜欢
    • 2015-12-17
    • 2021-12-04
    • 2021-08-19
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2021-12-23
    相关资源
    最近更新 更多