Сначала, если
- вы используете replaceAll ()
- Вы НЕ используете Matcher.quoteReplacement ()
- текст, который будет заменен, включает в себя $ 1
это не ставит 1 в конце. Он будет смотреть на регулярное выражение поиска для первой подходящей группы и подпункта THAT. Вот что означает $ 1, $ 2 или $ 3 в тексте замены: сопоставление групп из шаблона поиска.
Я часто вставляю длинные строки текста в файлы .properties, затем генерирую из них темы и сообщения электронной почты. Действительно, это, кажется, способ сделать i18n по умолчанию в Spring Framework по умолчанию. Я помещаю теги XML в качестве заполнителей в строки и использую replaceAll () для замены тегов XML значениями во время выполнения.
Я столкнулся с проблемой, когда пользователь вводил цифру в долларах и центах со знаком доллара. replaceAll () захлебнулся этим, в следовой строке появилось следующее:
java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
В этом случае пользователь ввел «$ 3» где-то в своем вводе, а replaceAll () пошёл искать в регулярном выражении поиска третью подходящую группу, не нашел ее и вырвал.
Дано:
// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input
замена
msg = msg.replaceAll("<userInput \\/>", userInput);
с
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
решил проблему. Пользователь может вводить любые символы, включая знаки доллара, без проблем. Он вел себя именно так, как вы ожидаете.