用单反斜杠替换双反斜杠

Vin*_*lam 5 java string replace character-encoding backslash

我有一个字符串“ \\ u003c”,它属于UTF-8字符集。由于存在双反斜杠,因此我无法将其解码为unicode。如何从“ \\ u003c”获取“ \ u003c”?我正在使用Java。

我尝试过

myString.replace("\\\\", "\\");
Run Code Online (Sandbox Code Playgroud)

但无法实现我想要的。

这是我的代码

String myString = FileUtils.readFileToString(file);
String a = myString.replace("\\\\", "\\");
byte[] utf8 = a.getBytes();

// Convert from UTF-8 to Unicode
a = new String(utf8, "UTF-8");
System.out.println("Converted string is:"+a);
Run Code Online (Sandbox Code Playgroud)

文件的内容是

\ u003c

mty*_*son 7

您可以使用String#replaceAll

String str = "\\\\u003c";
str= str.replaceAll("\\\\\\\\", "\\\\");
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)

看起来很奇怪,因为第一个参数是定义正则表达式的字符串,并且\在字符串文字正则表达式中都是特殊字符。要实际将a \放入搜索字符串中,我们需要\\在文字中对其进行转义()。但实际上把一个\正则表达式,我们在正则表达式水平逃脱它。因此,要从字面上获取\\字符串,我们需要\\\\在字符串文字中写入;并为\\正则表达式引擎提供两个文字,我们还需要对它们进行转义,因此最终得到\\\\\\\\。那是:

正则表达式的字符串文字字符串含义
???????????????????????? ?????????????????????????????? ?????????????????
\转义下一个字符将取决于下一个字符
\\ \转义下一个字符
\\\\ \\文字\
\\\\\\\\ \\\\文字\\

在更换参数,即使它不是一个正则表达式,它仍然对待\$特殊-所以我们要逃避他们在更换为好。因此,要在替换中获得一个反斜杠,我们在该字符串文字中需要四个反斜杠。


anu*_*ava 5

不确定您是否仍在寻找问题的解决方案(因为您已经接受了答案),但我仍然会添加我的答案作为上述问题的可能解决方案:

String str = "\\u003c";
Matcher m = Pattern.compile("(?i)\\\\u([\\da-f]{4})").matcher(str);
if (m.find()) {
    String a = String.valueOf((char) Integer.parseInt(m.group(1), 16));
    System.out.printf("Unicode String is: [%s]%n", a);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Unicode String is: [<]
Run Code Online (Sandbox Code Playgroud)

Here is online demo of the above code