Прямая косая черта в Java Regex

Я не могу понять, почему следующий код не работает должным образом

"Hello/You/There".replaceAll("/", "\\/");
  • Ожидаемый результат: Hello\/You\/There
  • Фактический вывод: Hello/You/There

Нужно ли мне скрывать косые черты? Я так не думал, но я также попробовал следующее против моей воли... не работал

"Hello/You/There".replaceAll("\\/", "\\/");

В конце я понял, что мне не нужно регулярное выражение, и я могу просто использовать следующее, которое не создает регулярное выражение

"Hello/You/There".replace("/", "\\/");

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

Ответ 1

Проблема в том, что вам нужно дважды сбрасывать обратную косую черту в заменяющей строке. Понимаете, "\\/" (как я уверен, вы знаете) означает, что строка замены \/, и (как вы, вероятно, не знаете), строка замены \/ фактически просто вставляет /, потому что Java странно, и дает \ особое значение в заменяющей строке. (Предполагается, что \$ будет буквальным знаком доллара, но я думаю, что настоящая причина в том, что они хотят общаться с людьми. Другие языки не делают этого таким образом.) Таким образом, вам нужно написать либо:

"Hello/You/There".replaceAll("/", "\\\\/");

или

"Hello/You/There".replaceAll("/", Matcher.quoteReplacement("\\/"));

(Используя java.util.regex.Matcher.quoteReplacement(String).)

Ответ 2

Двойное экранирование требуется при представлении в виде строки.

Всякий раз, когда я создаю новое регулярное выражение, я делаю кучу тестов с онлайн-инструментами, например: http://www.regexplanet.com/advanced/java/index.html

Этот веб-сайт позволяет вам ввести регулярное выражение, которое оно выйдет в строку для вас, и вы можете проверить его на разных входах.

Ответ 3

На самом деле есть причина, почему все эти проблемы перепутаны. Немного больше копания глубже делается в этой теме и может быть полезно понять причину, по которой "\\" ведет себя так.