2

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

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

我想\在这个列表中包含反斜杠,这样反斜杠就不会被替换。如果我这样给

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

它没有像我预期的那样工作。

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

Expected result :: xyda\asff
Output :: xydaasff

我不想更换\

4

4 回答 4

4

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

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

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

您可能会发现将模式打印到控制台最容易,这样您就可以准确地看到正则表达式引擎看到的内容,而无需 Java 字符串文字转义相关。上面的模式是:

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

所以带反斜杠的位是:

  • \d(数字)
  • \:(冒号)
  • \\(反斜杠)
于 2013-08-29T06:00:12.777 回答
3

要在正则表达式中编写单个文字反斜杠,您需要在代码中使用四个反斜杠 ( \\\\)(请参阅最后一个字符):

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

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


我们会在 Java 中摆脱这种令人眼花缭乱的编码吗?(努力寻找双关语)

于 2013-08-29T06:00:03.770 回答
1

您需要使用另一个斜线来转义斜线。所以\变成\\

对于正则表达式,我相信您需要再次转义它...

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

如果您还需要包含\斜线,则需要像\\\\

于 2013-08-29T05:59:00.177 回答
1

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

\\\\

这是因为您希望\\在实际的正则表达式中,但编译器还将 \ 视为字符串文字的转义,因此您需要再次转义每一个以在运行时将其通过实际字符串!

于 2013-08-29T06:00:16.887 回答