Прямая косая черта в 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
На самом деле есть причина, почему все эти проблемы перепутаны. Немного больше копания глубже делается в этой теме и может быть полезно понять причину, по которой "\\" ведет себя так.