用单反斜杠替换双反斜杠

时间:2012-06-13 09:45:18

标签: java string character-encoding replace backslash

我有一个字符串“\\ 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

7 个答案:

答案 0 :(得分:5)

您可以使用String#replaceAll

String str = "\\\\u003c";
str= str.replaceAll("\\\\\\\\", "\\\\");
System.out.println(str);

它看起来很奇怪,因为第一个参数是定义正则表达式的字符串,\是正则表达式中字符串文字中的特殊字符。要在搜索字符串中实际放置\,我们需要在文字中对其进行转义(\\)。但是要在{em>正则表达式中实际放置\,我们必须在正则表达式级别以及中转义它。因此,要在字符串中逐字地获取\\,我们需要在字符串文字中写入\\\\;为了得到两个文字\\到正则表达式引擎,我们也需要逃避它们,所以我们最终得到\\\\\\\\。那就是:

String Literal        String                      Meaning to Regex
−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−
\                     Escape the next character   Would depend on next char
\\                    \                           Escape the next character
\\\\                  \\                          Literal \
\\\\\\\\              \\\\                        Literal \\

在替换参数中,即使它不是正则表达式,它仍然特别对待\$ - 因此我们也必须在替换中将它们转义。因此,要在替换中获得一个反斜杠,我们需要四个字符串文字。

答案 1 :(得分:4)

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

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: [<]

Here is online demo of the above code

答案 2 :(得分:3)

另一个选项,捕获两个斜杠中的一个并用捕获的组替换两个斜杠:

public static void main(String args[])
{
    String str = "C:\\\\";
    str= str.replaceAll("(\\\\)\\\\", "$1");

    System.out.println(str);
} 

答案 3 :(得分:2)

关于&#34;用单个反斜杠替换双反斜杠的问题&#34;或者更一般地说,&#34;用不同的简单字符串替换包含\的简单字符串,其中包含\&#34; (这不完全是OP问题,而是其中的一部分):

这个帖子中的大部分答案都提到replaceAll,这是一个错误的工具。更简单的工具是replace,但令人困惑的是,OP指出replace("\\\\", "\\")对他不起作用,这可能是为什么所有答案都集中在replaceAll上。

有JavaScript背景的人的重要提示 请注意,Java中的replace(CharSequence, CharSequence)确实替换了所有出现的子字符串 - 与JavaScript不同,它只替换了第一个子字符串!

  

将此字符串中与文字目标序列匹配的每个子字符串替换为指定的文字替换序列。

另一方面,replaceAll(String regex, String replacement) - 更多文档also here - 将这两个参数视为常规字符串:

  

请注意,替换字符串中的反斜杠()和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同。

(这是因为\$可以用作对捕获的正则表达式组的反向引用,因此如果你想按字面意思使用它们,你需要转义它们。)

换句话说,replacereplaceAll的第一和第二参数表现不同。对于replace,你需要在两个参数中加倍\(在字符串文字中标准的反斜杠转义),而在replaceAll中,你需要将它翻两番! (标准字符串转义+特定于函数的转义)

总而言之,对于简单的替换,应该坚持replace("\\\\", "\\")(它只需要一次转义,而不是两次)。

https://ideone.com/ANeMpw

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"

https://www.ideone.com/Fj4RCO

String str = "\\\\u003c";
System.out.println(str);                                // "\\u003c"
System.out.println(str.replaceAll("\\\\\\\\", "\\\\")); // "\u003c"
System.out.println(str.replace("\\\\", "\\"));          // "\u003c"

答案 4 :(得分:0)

这是用于将双反斜杠替换为单反斜杠

public static void main(String args[])
{
      String str = "\\u003c";
      str= str.replaceAll("\\\\", "\\\\");

      System.out.println(str);
}

答案 5 :(得分:0)

"\\u003c"根本不属于“UTF-8字符集”。它是五个 UTF-8字符:'\','0','0','3'和'c'。这里真正的问题是为什么那里有双反斜杠?或者, 他们真的在那里吗?你的问题或许是完全不同的东西吗?如果字符串"\\u003c"在你的源代码中,那么在运行时根本就没有双反斜杠,无论你的问题是什么,它都不涉及在存在双反斜杠的情况下进行解码。

答案 6 :(得分:0)

尝试使用,

  

myString.replaceAll(“ [\\\\] {2}”,“ \\\\”);