Прежде всего, если
, он не поместит 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));
решил проблему. Пользователь может вводить любые символы, включая знаки доллара, без проблем. Он вел себя так, как вы ожидали.
Попробуйте это
/a/aCode[text()='aaa']
или
//*[local-name() = 'aCode' and text() = 'aaa']
Вы использовали //
в неправильном месте.