replaceAll(target, replacement)
использует регулярное выражение (regex) синтаксис для target
и частично для replacement
.
Проблема заключается в том, что \
является специальным символом в регулярном выражении (как \d
к представляет цифру) и в строковом литерале (например, \n
создать разделительную линию или \"
представлять двойной символ кавычки), и создать \
символ нам нужно, чтобы избежать его с дополнительным \
перед этим на обоих этих уровнях.
Итак, чтобы создать target
регулярное выражение, которое будет представлять \
символ, нам нужно, чтобы избежать его дважды:
- в регулярных выражениях
\\
- Строки буквального
"\\\\"
(каждый \
нуждается в собственной дополнительной \
раньше).
В случае replacement
\
также особенного, чтобы избежать еще один специальный символ, который $
. Через $x
запись, часть данных, соответствующая регулярному выражению, может быть доступна и использована повторно, например, replaceAll("(\d)", "$1$1")
будет дублировать каждую цифру.
Итак, еще раз, чтобы иметь одного\
в replacement
нам нужно текст, представляющий два обратных слеша:
\\
- но строковый литерал, представляющие
\\
выглядеть "\\\\"
НО так как мы хотим положить \
на замену нам нужен "\\\\\\\\"
там (два "\\\\"
).
replaceAll("\\\\", "\\\\\\\\");
Оформлять жизнь проще Java предоставляет инструменты для автоматического избежать текста в target
и replacement
частей. Так что теперь мы можем сосредоточиться только на струнах, и забыть о регулярных выражений синтаксис:
replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
в нашем случае может выглядеть
replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
Или еще проще, если мы не хотим использовать regex позволяет не включать replaceAll
и вместо этого использовать replace
(оба метода будут заменять все target
s, но во втором случае не требуется синтаксис regex). Поэтому вы можете просто написать
theString = theString.replace("\\", "\\\\")
Фактически, он используется в JavaScript AST, который должен быть преобразован обратно в исходный код. Ваше решение работает. Благодаря! –
Если вы хотите использовать 'String # replaceAll()' в любом случае, вы можете привести строку замены с помощью [Matcher # quoteReplacement()] (http://docs.oracle.com/javase/7/docs/api/java/ util/regex/Matcher.html # quoteReplacement (java.lang.String)): 'theString.replaceAll (" \\ ", Matcher.quoteReplacement (" \\\\ "));' –