用单反斜杠替换双反斜杠

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

OUTPUT:

 Unicode String is: [<] 

Here is online demo of the above code

您可以使用String#replaceAll

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

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

字符串文字字符串对正则表达式的意义
 --------------------- ---------------------------  - ---------------
 \逃脱下一个角色将取决于下一个字符
 \\ \逃离下一个角色
 \ \ \ \ \ \文字\
 \ Lite \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

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

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

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

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

这个post中的大多数答案都提到了replaceAll ,这是一个错误的工具。 更容易的工具是replace ,但令人困惑的是, replace("\\\\", "\\")的OP状态对他不起作用,这也许是为什么所有答案都集中在replaceAll

具有JavaScript背景的人员的重要注意事项请注意,Java中的replace(CharSequence, CharSequence)确实会替换所有出现的子字符串 – 与JavaScript不同,它只替换第一个!

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

另一方面, replaceAll(String regex, String replacement) – 这里也有更多的文档 – 将这两个参数视为常规字符串:

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

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

换句话说, replacereplace第一和第二参数都表现不同。 对于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" 

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

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

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

试试用,

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