如何用\?替换字符串中的一个或多个\?

时间:2014-05-26 11:57:30

标签: java regex string replace replaceall

考虑字符串,

this\is\\a\new\\string

输出应为:

this\is\a\new\string

所以基本上一个或多个\字符应该只用一个\替换。 我尝试了以下方法:

str = str.replace("[\\]+","\")

但是没用。我在\中使用两个[\\]+的原因是因为内部\存储为\\。我知道这可能是一个基本的正则表达式问题,但我能够替换一个或多个普通字母而不是\字符。任何帮助都非常感谢。

5 个答案:

答案 0 :(得分:21)

str.replace("[\\]+", "\")几乎没有问题,

  • replace不使用正则表达式(replaceAll确实如此),因此"[\\]"代表[\]字面值,而非\\\(取决于"[\\]"在你认为它代表什么)
  • 即使它确实接受了正则表达式\\]也不是正确的正则表达式,因为]会转义[..所以你最终会得到未闭合的字符类\
  • 它将无法编译(您的替换字符串未关闭)

它不会编译,因为\X是转义序列X的开始,其中\"需要

  • 从String特殊字符变为简单文字,就像在你的情况下"\n转义为文字(因此你可以打印它)而不是String的开头/结尾,
  • 从普通字符变为特殊字符,例如行分隔符\r \t或表格\

现在我们知道\很特殊,用于逃避其他角色。那么您认为我们需要做些什么来使\代表文字(当我们想要打印\时)。如果您猜测它需要与另一个\一起转义,那么您是对的。要创建"\\"文字,我们需要将其作为\写在字符串中。

由于您知道如何创建包含\文字(转义\)的字符串,因此您可以开始考虑如何创建替代品。

代表一个或多个\\+的正则表达式可能看起来像

\\

但这是它的原生形式,我们需要使用String创建它。我在这里使用了\,因为在正则表达式\d中也是特殊字符(例如\代表数字,而不是d字面后跟{{1因此,它还需要首先进行转义以表示\字面值。就像在String中一样,我们可以使用另一个\来逃避它。

因此,表示此正则表达式的字符串需要写为

"\\\\+"(我们两次转发\,一次使用正则表达式\\+,一次转换为字符串)

您可以将其用作replaceAll的第一个参数(因为前面提到的replace不接受正则表达式)。

现在你要面对的最后一个问题是replaceAll方法的第二个参数。如果你写

replaceAll("\\\\+", "\\")

它会找到正则表达式的匹配,你会看到异常

java.lang.IllegalArgumentException: character to be escaped is missing

这是因为在replacement部分(replaceAll方法中的第二个参数),我们还可以使用特殊公式$x来表示来自具有索引{{1}的组的当前匹配} 的。因此,为了能够将x转换为文字,我们需要一些转义机制,并且此处再次使用$来实现此目的。 因此\在我们方法的替换部分中也很特殊 因此,要再次创建\字面值,我们需要使用另一个\来转义它,并且表示表达式\的字符串文字是\\

但是让我们回到之前的例外:消息“要转义的字符丢失”是指"\\\\" X公式的一部分(X是我们想要转义的字符)。问题是,您的替代\X早期仅代表"\\"部分,因此此方法需要\创建$\$才能创建\\文字。因此,有效替换为\"\\$


为了使事情有效,您需要将替换方法写为

"\\\\"

答案 1 :(得分:5)

您可以使用:

str = str.replace("\\\\", "\\");

请记住,String#replace不会使用正则表达式。

答案 2 :(得分:4)

试试这个

str = str.replaceAll("\\\\+", "\\\\");

答案 3 :(得分:1)

编写正则表达式时,通常需要双重转义反斜杠。所以你会这样做:

str = str.replaceAll("\\\\+", "\\\\");

答案 4 :(得分:1)

我在这里使用Matcher.quoteReplacement()String.replaceAll()

赞:

String s;
[...]
s = s.replaceAll("\\\\+", Matcher.quoteReplacement("\\"));