java - 如果从 Java 控制台读取正则表达式字符,为什么不需要转义?

标签 java regex

请看以下程序:

UseArgs.java

import java.util.regex.*;

class UseArgs {
    public static void main(String [] args) {
        String foo = args[0];
        String bar = args[1];

        Pattern p = Pattern.compile(foo);
        Matcher m = p.matcher(bar);

        while(m.find()) {
            System.out.print("Found at index: " + m.start() + "\n");
        }
    }
}

UseConsole.java

import java.util.regex.*;
import java.io.Console;

class UseConsole {
    public static void main(String [] args) {
        Console console = System.console();

        String foo = console.readLine("foo: ");
        String bar = console.readLine("bar: ");

        Pattern p = Pattern.compile(foo);
        Matcher m = p.matcher(bar);

        while(m.find()) {
            System.out.print("Found at index: " + m.start() + "\n");
        }
    }
}

因此,为了使用 UseArgs,我需要按如下方式调用程序:

MacBook-Pro:~ koraytugay$ java UseArgs \\d 4
Found at index: 0

但对于 UseConsole,请查看我如何 需要转义“任何数字”字符:

MacBook-Pro:~ koraytugay$ java UseConsole
foo: \d
bar: 4
Found at index: 0

行为差异背后的原因是什么?我试过了,但找不到任何文档,说明为什么我们在使用控制台读取表达式时不需要需要转义。

最佳答案

当您从命令提示符“调用”您的程序时,您向另一个正在运行的程序提供了输入 - 操作系统的“shell 程序”。

Shell 有自己的语法规则。特别是,他们使用反斜杠作为转义字符。因此,您要传递给 Java 程序的输入首先用作 shell 程序的输入;您的 Java 程序获得 shell 对该输入进行转换后的输出。

除其他外,shell 将所有单个反斜杠解释为转义字符,将它们从它传递给您的 Java 程序(或任何其他程序,就此而言)的字符串中剥离。这就是为什么最终用户在命令行中输入时必须转义单个斜线的原因。

当您在 Java 代码中对正则表达式进行硬编码时,也会出现类似的过程。这一次,编译器使用稍微严格的规则来去除反斜杠(与大多数 shell 不同,Java 错误处理字符串文字中的“杂散”反斜杠,而不是将它们丢弃)。

相比之下,您从控制台读取的输入没有经过任何转换。您的程序是第一个获取输入的程序,因此不需要反斜杠转义。

关于java - 如果从 Java 控制台读取正则表达式字符,为什么不需要转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45127339/

相关文章:

java - 如何处理 Java PreparedStatement 中的特殊字符?

java - OkHttp3 抓取的 HTML 页面不完整,需要 JavaScript 吗?

java - @Autowired 在 Spring 中使用 Jersey 时不起作用

java - 根据参数显示不同的消息

javascript - 使用 JS Regex 获取带有动态尾随值的字符串的第一个值

java - Maven编译错误: cannot find symbol

regex - 这个awk语句是什么意思?

用于匹配任何 URL 字符的正则表达式

Mysql RLIKE/PREG_MATCH 错误

c# - 正则表达式 : single word