我想替换哪些不在提供的列表中
[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}:;<,>.?/ ]
我想在此列表中包含反斜杠\
,以便不会替换反斜杠。
如果我这样给予
.replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")
它没有像我预期的那样工作。
"xyda\asff"..replaceAll("[^-\\dA-Za-zÂÃâ`~!@#$%^&*()_+=[{]}\\:;<,>.?/ ]","")
Expected result :: xyda\asff
Output :: xydaasff
我不想替换\
。
答案 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正则表达式中使用文字反斜杠,您需要四个反斜杠。
\\\\
这是因为你希望\\
在实际的正则表达式中,但是编译器也会将\视为字符串文字的转义符,所以你需要再次转义每一个以使其进入实际运行时的字符串!