如何表示反斜杠

时间:2013-08-29 05:57:13

标签: java regex

我想替换哪些不在提供的列表中

[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ ]

我想在此列表中包含反斜杠\,以便不会替换反斜杠。 如果我这样给予

.replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")
它没有像我预期的那样工作。

"xyda\asff"..replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")

Expected result :: xyda\asff
Output :: xydaasff

我不想替换\

4 个答案:

答案 0 :(得分:4)

您需要应用两个级别的转义 - 一个用于正则表达式本身,另一个用于Java字符串文字。这意味着你需要连续四个反斜杠。所以:

replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/\\\\ ]", "")

我认为\\d旨在涵盖任何数字,而不是实际d放入列表中?

您可能会发现将模式打印到控制台最简单,因此您可以准确地看到正则表达式引擎看到的内容,而Java字符串文字转义不相关。上述模式是:

[^-\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\:;<,>.?/\\ ]

所以带反斜杠的位是:

  • \d(数字)
  • \:(冒号)
  • \\(反斜杠)

答案 1 :(得分:2)

要在regex中编写单个文字反斜杠,代码中需要四个反斜杠(\\\\)(参见最后一个字符):

[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ \\\\]

每对反斜杠都是字符串中的一个反斜杠,你需要两个反斜杠,所以它在正则表达式中进一步转义;你需要逃脱逃生。


我们是否会在java中逃避这种编码眼睛? (努力争取双关语)

答案 2 :(得分:1)

您需要使用另一个斜杠来转义斜杠。因此\变为\\

对于正则表达式,我相信你需要再次逃避...

.replaceAll("[^-\\dA-Za-zÂÃâ~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")
                ^^                            ^^

如果您还需要包含\斜杠,则需要将其转义为\\\\

答案 3 :(得分:1)

要在代码中以字符串文字形式提供的java正则表达式中使用文字反斜杠,您需要四个反斜杠。

\\\\

这是因为你希望\\在实际的正则表达式中,但是编译器也会将\视为字符串文字的转义符,所以你需要再次转义每一个以使其进入实际运行时的字符串!