Замена двойной обратной косой черты одной обратной косой чертой

У меня есть строка «\\ u003c», которая принадлежит к кодировке UTF-8. Я не могу декодировать его в Unicode из-за наличия двойной обратной косой черты. Как получить & quot; \ u003c & quot; от & quot; \ u003c & quot ;? Я использую 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

 Ahamed Mustafa M13 июн. 2012 г., 11:49
Можете ли вы опубликовать код, который вы используете для декодирования строки?

Ответы на вопрос(6)

String#replaceAll:

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

Это выглядит странно, потому что первый аргумент - это строка, определяющая регулярное выражение, и\ это специальный символ как в строковых литералахand в регулярных выражениях. На самом деле положить\ в нашей строке поиска нам нужно ее избежать (\\в буквальном смысле. Но на самом деле положить\ вregular expressionмы должны избежать этого на уровне регулярного выраженияas well, Таким образом, чтобы буквально получить\\ в строке нам нужно написать\\\\ в строковом литерале; и получить два буквальных\\ к движку регулярных выражений, мы должны избегать их, поэтому мы в конечном итоге\\\\\\\\, То есть:

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

В параметре замены, даже если он не является регулярным выражением, он все равно обрабатывает\ а также$ специально & # xA0; & # x2014; и поэтому мы должны избежать их в замене. Таким образом, чтобы получить один обратный слеш при замене, нам нужно четыре в этом строковом литерале.

 04 июл. 2017 г., 16:37
Единственный короткий и правильный ответ в этой теме :) Да, и 1-й, и 2-й аргументы должны иметь символ \ в четыре раза, так как на самом деле обе строки являются специальными строками регулярных выражений, а не обычными строками.
 25 окт. 2018 г., 22:11
Это мой лучший ответ, который я действительно не написал! Кредит переходит к @ T.J.Crowder!
 25 окт. 2018 г., 23:28
@mtyson - Просто немного уточнил. ;-) Мне нравится, когда совместный аспект SO работает.
 26 апр. 2018 г., 17:57
@ T.J.Crowder это заняло у меня некоторое время, но я наконец-то опубликовалreplace ответ!
 05 июл. 2017 г., 10:19
@ jakub.g: Вы должны опубликоватьreplace ответ. Как вы сказали в моем теперь удаленном ответе,replaceAll это просто неправильный инструмент, если ваша цель заменить\\ с\.

"\\u003c" не принадлежит к кодировке UTF-8; совсем. этоfive Символы UTF-8: & apos;\"," 0 "," 0 "," 3 "и" с ". Настоящий вопрос здесь заключается в том, почему двойные обратные слеши вообще существуют? Или же,are они действительно есть? и ваша проблема, может быть, что-то совершенно другое? Если строка"\\u003c" в вашем исходном коде, во время выполнения в нем вообще нет двойной обратной косой черты, и, какой бы ни была ваша проблема, это не касается декодирования при наличии двойной обратной косой черты.

ту

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

      System.out.println(str);
}
 17 июн. 2014 г., 14:07
Что-то изменилось в Java 7? Этот код больше не работает.Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1

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

захватить один из двух слэшей и заменить оба слэша захваченной группой:

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

    System.out.println(str);
} 
Решение Вопроса

что вы все еще ищете решение своей проблемы (поскольку у вас есть принятый ответ), но я все равно добавлю свой ответ в качестве возможного решения проблемы.stated problem:

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

 Vinay thallam14 июн. 2012 г., 07:57
Волшебно заменяет & quot; \\ & quot; с & quot; \ & quot ;. Спасибо
 Vinay thallam14 июн. 2012 г., 12:53
@EJP Привет. Я уверен, что в myString есть двойные обратные слеши. Когда я назначаю & quot; \ u003c & quot; myString в моем исходном коде и вскоре после его печати на консоль, он выдает "& lt;". Но если я прочитал то же самое \ u003c " из некоторого файла и назначить его myString и сделать на консоли, он печатает \ u003c. Я предполагаю, что FileUtils API экранирует обратную косую черту при чтении файла.
 14 июн. 2012 г., 08:43
Остается вопрос: почему двойные обратные слеши в Стринге в первую очередь?

Ваш ответ на вопрос