gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:51:54 24 4
gpt4 key购买 nike

请看以下程序:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com