考虑字符串,
this\is\\a\new\\string
输出应为:
this\is\a\new\string
所以基本上一个或多个\
字符应该只用一个\
替换。
我尝试了以下方法:
str = str.replace("[\\]+","\")
但是没用。我在\
中使用两个[\\]+
的原因是因为内部\
存储为\\
。我知道这可能是一个基本的正则表达式问题,但我能够替换一个或多个普通字母而不是\
字符。任何帮助都非常感谢。
答案 0 :(得分:21)
str.replace("[\\]+", "\")
几乎没有问题,
replace
不使用正则表达式(replaceAll
确实如此),因此"[\\]"
代表[\]
字面值,而非\
或\\
(取决于"[\\]"
在你认为它代表什么)\\]
也不是正确的正则表达式,因为]
会转义[..
所以你最终会得到未闭合的字符类\
它不会编译,因为\X
是转义序列X
的开始,其中\"
需要
"
将\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("\\"));