首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java中的反斜杠替换字符串中的所有点

用Java中的反斜杠替换字符串中的所有点
EN

Stack Overflow用户
提问于 2013-11-02 18:59:44
回答 4查看 5.6K关注 0票数 1

下面的代码用完全限定类名中的反斜杠替换所有点(可以是任何字符串)。

代码语言:javascript
复制
String str=Test.class.getName().replaceAll("\\.", "\\\\") + ".class";
System.out.println(str);

替换字符串需要四个反斜杠。

假设替换字符串是文件路径中的分隔符,我希望使用java.io.File.separator使其独立于不同的操作系统。

代码语言:javascript
复制
String separator=File.separator+File.separator
String str=Test.class.getName().replaceAll("\\.", separator) + ".class "
System.out.println(str);

在这种情况下,它只使用两个反斜杠。为什么它不需要四个反斜杠,就像以前的情况一样?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-02 19:22:52

Java字符串是由字符组成的。为了允许java程序员将字符串作为‘常量’和Java代码的一部分输入,该语言允许您将字符串键入为被‘“引号包围的字符……

代码语言:javascript
复制
 String str = "this is a string";

有些字符很难输入到程序中,比如换行符或制表符。Java引入了转义机制,允许程序员将这些字符输入到字符串中。逃逸机制是“\”反斜杠。

代码语言:javascript
复制
 String str = "this contains a tab\t and newline\n";

问题是,现在没有一种简单的方法可以输入反斜杠,所以要输入反斜杠,就必须逃离它自己:

代码语言:javascript
复制
 String str = "this contains a backslash \\"

下一个问题是正则表达式是复杂的,它们还使用反斜杠\作为转义字符。

例如,在perl中,正则表达式\.将匹配确切的字符“.”因为在正则表达式中“.”是特殊的,需要用“\”来转义。要在Java程序中捕获序列\. (作为程序中的字符串常量),我们需要转义'\‘as \\,而我们的Java等效正则表达式是\\.。现在,在perl中,匹配实际反斜杠字符的正则表达式还是\\。类似地,我们需要在实际代码中转义这两者,这就是\\\\

因此,这里的意义是窗口中的文件分隔符是反斜杠\.此单个字符存储在字段File.separator中。如果我们想从一个Java程序中键入相同的字符,我们必须将它转义为\\,但是'\‘已经存储在字段中,所以我们不需要为Java程序重新转义它,但是 do 需要为正则表达式转义它.

有两种方法可以为正则表达式转义它。您可以选择在反斜杠之前添加反斜杠:

代码语言:javascript
复制
"\\" + File.separator 

但是这是一个不好的方法,因为它不能在Unix上工作(在Unix中,不需要转义分隔符。更糟糕的是,您所做的事情是将文件分隔符加倍:

代码语言:javascript
复制
File.separator+File.separator

正确的方法是用Matcher.quoteReplacement(.)正确地转义正则表达式的替换侧。

代码语言:javascript
复制
System.out.println(Test.class.getName().replaceAll("\\.",
      Matcher.quoteReplacement(File.separator)) + ".class ")
票数 5
EN

Stack Overflow用户

发布于 2013-11-02 19:03:49

这四个反斜杠用于对该方法使用的两个反斜杠进行编码。"\\\\"被解释为:

代码语言:javascript
复制
"\\" (an escaped backslash)
"\\" (another escaped backslash)

第1和第3反斜杠是为了逃避字符串中的第2和第4反斜杠。如果反斜杠存储在诸如File.separator这样的变量中,则不需要反斜杠。

要想得到更清晰的答案,请尝试下面的代码:

代码语言:javascript
复制
System.out.println("\\\\");

它打印\\

票数 3
EN

Stack Overflow用户

发布于 2013-11-02 19:04:17

因为File.separator

代码语言:javascript
复制
public static final String separator = "" + separatorChar;
public static final char separatorChar = fs.getSeparator(); //gotten from system properties

其中separatorChar是用于文件分离的特定于系统的char。在这种情况下你不需要逃避任何事情。

为什么它不需要四个反斜杠,就像以前的情况一样?

转义是用于文本的.

fs.getSeparator()所做的是(简单地说)

代码语言:javascript
复制
System.getProperty("file.separator");

在Windows上返回String \。然后,getSeperator()获取该字符串的charAt(0),即char '\'。中的String""连接时,将其转换为

代码语言:javascript
复制
public static final String separator = "" + separatorChar;

这是在运行时完成的,因此不计算为String文本,因此不需要转义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19745643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档