Xpath: выбрать узел на основе условия (с local-name ())

Прежде всего, если

  • вы используете replaceAll ()
  • , вы НЕ используете Matcher.quoteReplacement ()
  • текст, который должен быть замещенный в включает $ 1

, он не поместит 1 в конец. Он будет искать регулярное выражение поиска для первой группы соответствия и sub THAT. Вот что означает $ 1, $ 2 или $ 3 в заменяющем тексте: сопоставление групп с шаблоном поиска.

Я часто подключаю длинные строки текст в .properties файлы, а затем создавать темы электронной почты и тела из них. В самом деле, это, по-видимому, является способом по умолчанию для i18n в Spring Framework. Я помещал теги XML в качестве заполнителей в строки, и я использую replaceAll () для замены тегов XML значениями во время выполнения.

Я столкнулся с проблемой, когда пользователь вводил доллары и центы фигура со знаком доллара. replaceAll (), забитый на нем, со следующим отображением в stracktrace:

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 () отправился искать в поиске regex для третьей сопоставимой группы, не нашел ее и не запутался.

Учитывая:

// "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));

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

24
задан Bhargav Rao 1 July 2019 в 14:16
поделиться