我有一个字符串“\\ u003c”,它属于UTF-8字符集。由于存在双反斜杠,我无法将其解码为unicode。我如何从“\\ u003c”获得“\ u003c”?我正在使用java。
我试过了,
myString.replace("\\\\", "\\");
但无法实现我想要的。
这是我的代码,
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);
和文件的内容是
\ u003c
不确定您是否仍在寻找问题的解决方案(因为您已接受答案)但我仍然会将我的答案添加为所述问题的可能解决方案:
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);
}
Unicode String is: [<]
你可以使用String#replaceAll
:
String str = "\\\\u003c";
str= str.replaceAll("\\\\\\\\", "\\\\");
System.out.println(str);
它看起来很奇怪,因为第一个参数是一个定义正则表达式的字符串,而\
是字符串文字和正则表达式中的特殊字符。要在我们的搜索字符串中实际放置\
,我们需要在文字中转义它(\\
)。但实际上将\
放在正则表达式中,我们也必须在正则表达式级别上将其转义。因此,为了在字符串中获得\\
,我们需要在字符串文字中写入\\\\
;为了得到两个文字\\
到正则表达式引擎,我们也需要逃避它们,所以我们最终得到\\\\\\\\
。那是:
String Literal String Meaning to Regex −−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−− \ Escape the next character Would depend on next char \\ \ Escape the next character \\\\ \\ Literal \ \\\\\\\\ \\\\ Literal \\
在替换参数中,即使它不是正则表达式,它仍然特别对待\
和$
- 因此我们必须在替换中逃避它们。因此,要在替换中获得一个反斜杠,我们需要四个字符串文字。
另一个选项是捕获两个斜杠中的一个并用捕获的组替换两个斜杠:
public static void main(String args[])
{
String str = "C:\\\\";
str= str.replaceAll("(\\\\)\\\\", "$1");
System.out.println(str);
}
关于“用单反斜杠替换双反斜杠”的问题,或者更一般地说,“用包含\
的不同简单字符串替换包含\
的简单字符串”(这不完全是OP问题,而是其中的一部分):
这个帖子中的大多数答案都提到了replaceAll
,这是一个错误的工具。更简单的工具是replace
,但令人困惑的是,OP声称replace("\\\\", "\\")
不适合他,这也许是为什么所有答案都集中在replaceAll
。
具有JavaScript背景的人员的重要注意事项:请注意,Java中的replace(CharSequence, CharSequence)
会替换所有出现的子字符串 - 与JavaScript不同,它只替换第一个子字符串!
将与该文字目标序列匹配的此字符串的每个子字符串替换为指定的文字替换序列。
另一方面,replaceAll(String regex, String replacement)
- 更多文档also here - 将两个参数视为常规字符串:
请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。
(这是因为\
和$
可以用作对捕获的正则表达式组的反向引用,因此如果你想按字面意思使用它们,你需要逃避它们)。
换句话说,replace
和replaceAll
的第一和第二范围都表现不同。对于replace
,你需要在两个参数中加倍\
(标准字符串文字中的反斜杠),而在replaceAll
中,你需要将它翻两番! (标准字符串转义+特定于函数的转义)
总而言之,对于简单的替换,人们应该坚持使用replace("\\\\", "\\")
(它只需要一次逃逸,而不是两次)。
System.out.println("a\\\\b\\\\c"); // "a\\b\\c"
System.out.println("a\\\\b\\\\c".replaceAll("\\\\\\\\", "\\\\")); // "a\b\c"
//System.out.println("a\\\\b\\\\c".replaceAll("\\\\\\\\", "\\")); // runtime error
System.out.println("a\\\\b\\\\c".replace("\\\\", "\\")); // "a\b\c"
String str = "\\\\u003c";
System.out.println(str); // "\\u003c"
System.out.println(str.replaceAll("\\\\\\\\", "\\\\")); // "\u003c"
System.out.println(str.replace("\\\\", "\\")); // "\u003c"
这是用于将双反斜杠替换为单反斜杠
public static void main(String args[])
{
String str = "\\u003c";
str= str.replaceAll("\\\\", "\\\\");
System.out.println(str);
}
"\\u003c"
根本不属于“UTF-8 charset”。它是五个UTF-8字符:'\
','0','0','3'和'c'。这里真正的问题是为什么那里有双反斜杠?或者,他们真的在那里吗?你的问题或许是完全不同的东西吗?如果字符串"\\u003c"
在您的源代码中,则在运行时根本没有双反斜杠,无论您遇到什么问题,它都不涉及在存在双反斜杠的情况下进行解码。
试试用,
myString.replaceAll(“[\\\\] {2}”,“\\\\”);