Подтвердить что ты не робот

Java - регулярное выражение для соответствия обратному косую черту с последующей цитатой

Как написать регулярное выражение для соответствия этому \" (обратная косая черта, а затем цитата)?   Предположим, у меня есть строка вроде этого:

<a href=\"google.com\"> click to search </a>

Мне нужно заменить все \" на ", поэтому результат будет выглядеть так:

<a href="google.com"> click to search </a>

Это не работает: str.replaceAll("\\\"", "\""), потому что он соответствует только цитате. Не уверен, как обойти обратную косую черту. Я мог бы удалить обратную косую черту сначала, но в моей строке есть другие обратные косые черты.

4b9b3361

Ответ 1

Если вы заменяете литералы и вам не нужен синтаксис регулярных выражений вместо replaceAll используйте replace

str = str.replace("\\\"","\"");

Оба метода заменят все вхождения целей, но replace будет обрабатывать цели буквально.


НО, если вы действительно должны использовать регулярное выражение, которое вы ищете

str = str.replaceAll("\\\\\"", "\"")

\ является специальным символом в регулярном выражении (используется, например, для создания \d - символьного класса, представляющего цифры). Чтобы регулярное выражение рассматривало \ как нормальный символ, вам нужно поместить еще один \ перед ним, чтобы отключить его специальное значение (вам нужно избегать его). Итак, регулярное выражение, которое мы пытаемся создать - это \\.

Но чтобы создать строку, представляющую \\ чтобы вы могли передать ее в движок регулярных выражений, вам нужно записать ее как четыре \ ("\\\\"), потому что \ также является специальным символом в String (его можно использовать, например, как \t представлять табулятор) так что вам также нужно экранировать оба \ там.

Другими словами, вам нужно убежать \ дважды:

  • однажды в регулярном выражении \\
  • и однажды в "\\\\"

Ответ 2

Вам не нужно регулярное выражение.

str.replace("\\\"", "\"")

должен работать нормально.

Метод replace принимает две подстроки и заменяет все неперекрывающиеся вхождения первого со вторым. На javadoc:

public String replace(CharSequence target,
                      CharSequence replacement)

Заменяет каждую подстроку этой строки, которая соответствует буквенной целевой последовательности с указанной последовательностью замены литерала. Замена происходит от начала строки до конца, например, замена "aa" на "b" в строке "aaa" приведет к "ba", а не к "ab".

Ответ 3

попробуйте следующее: str.replaceAll("\\\\\"", "\\\"")
потому что Java заменит \ дважды:

(1) \\\\\"\\" (для строки)
(2) \\"\" (для регулярного выражения)