Java - регулярное выражение для соответствия обратному косую черту с последующей цитатой
Как написать регулярное выражение для соответствия этому \"
(обратная косая черта, а затем цитата)? Предположим, у меня есть строка вроде этого:
<a href=\"google.com\"> click to search </a>
Мне нужно заменить все \"
на "
, поэтому результат будет выглядеть так:
<a href="google.com"> click to search </a>
Это не работает: str.replaceAll("\\\"", "\"")
, потому что он соответствует только цитате. Не уверен, как обойти обратную косую черту. Я мог бы удалить обратную косую черту сначала, но в моей строке есть другие обратные косые черты.
Ответы
Ответ 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) \\"
→ \"
(для регулярного выражения)