如何解决在Java中用正则表达式转义双斜杠
|| 我有这个单元测试:public void testDeEscapeResponse() {
final String[] inputs = new String[] {\"peque\\\\\\\\u0f1o\",\"peque\\\\u0f1o\"};
final String[] expected = new String[] {\"peque\\\\u0f1o\",\"peque\\\\u0f1o\"};
for (int i = 0; i < inputs.length; i++) {
final String input = inputs[i];
final String actual = QTIResultParser.deEscapeResponse(input);
Assert.assertEquals(
\"deEscapeResponse did not work correctly\",expected[i],actual);
}
}
我有这种方法:
static String deEscapeResponse(String str) {
return str.replaceAll(\"\\\\\\\\\",\"\\\\\");
}
单元测试失败,并显示以下错误:
java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:686)
at java.util.regex.Matcher.appendReplacement(Matcher.java:703)
at java.util.regex.Matcher.replaceAll(Matcher.java:813)
at java.lang.String.replaceAll(String.java:2189)
at com.acme.MyClass.deEscapeResponse
at com.acme.MyClassTest.testDeEscapeResponse
为什么?
解决方法
使用
String.replace
(而不是使用正则表达式的String.replaceAll
)进行字面替换。
例:
\"peque\\\\\\\\u0f1o\".replace(\"\\\\\\\\\",\"\\\\\") // gives peque\\u0f1o
String.replaceAll
使用正则表达式,因此\\\\\\\\
被解释为表达式the8ѭ,而表达式matches8ѭ又匹配单个\\
。 (替换字符串还对ѭ9进行特殊处理,因此那里也有错误。)
要使String.replaceAll
像您在这里期望的那样工作,您需要做
\"peque\\\\\\\\u0f1o\".replaceAll(\"\\\\\\\\\\\\\\\\\",\"\\\\\\\\\")
, 我认为问题在于您使用的是replaceAll()而不是replace()。 replaceAll在第一个字段中需要一个正则表达式,而您只是想进行字符串匹配。
, 参见Javadoc中的Matcher
:
请注意,反斜杠(\\)和美元
替换字符串中的符号($)
可能导致结果不同
比起将其视为
文字替换字符串。美元
迹象可被视为对
如所述捕获的子序列
以上,反斜杠用于
转义文字
替换字符串。
因此,使用replaceAll
不能用反斜杠替换任何内容。因此,针对您的案例而言,真正疯狂的解决方法是str.replaceAll(\"\\\\\\\\(\\\\\\\\)\",\"$1\")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。