Matcher.appendReplacement с буквенным текстом - PullRequest
14 голосов
/ 04 июня 2009

Я использую Matcher.appendReplacement () , и он работал прекрасно, пока в моей строке замены не было $ 2:

Обратите внимание, что обратная косая черта (\) и доллар знаки ($) в строке замены может привести к разным результатам чем если бы это рассматривалось как буквенная замена строки. доллар знаки могут рассматриваться как ссылки на захваченные подпоследовательности, как описано выше, а обратные слеши используются для избежать буквальных символов в строка замены.

Есть ли где-нибудь удобный метод, который позволит избежать обратной косой черты \ и знака доллара $ с обратной косой чертой? Или я должен написать один сам? Похоже, это не так сложно, просто было бы неплохо, если бы они дали вам один>: (* ​​1009 *

edit: , поскольку они дают вам один, мне нужно replace(">:(", ":-)");

Ответы [ 3 ]

23 голосов
/ 04 июня 2009

Используйте Matcher.quoteReplacement в строке замены.

К сожалению, «простота использования» в этом случае противоречит строгой типизации. [Объяснение: Объект статического типа Java java.lang.String является любой неизменной последовательностью char с. Он не говорит вам формат этих необработанных данных. В этом сценарии у нас есть текст, вероятно значимый для пользователя, текст, закодированный на мини-языке для замены, и текст, закодированный на мини-языке для шаблона. Система типов Java не может их различить (хотя вы можете делать забавные вещи с помощью средств проверки типов на основе аннотаций, часто чтобы избежать уязвимостей XSS или SQL / внедрения команд). Для шаблонного мини-языка вы можете преобразовать форму в Pattern.compile, хотя это специфическое использование, и большинство методов API его игнорируют (для простоты использования). Эквивалент ReplacementText.compile может быть написан. Кроме того, вы можете игнорировать мини-языки и использовать библиотеки как «DSL». Но все это не помогает простоте использования.]

12 голосов
/ 04 июня 2009

Вот еще один вариант:

matcher.appendReplacement(stringbuffer, "");
stringbuffer.append(replacement);

appendReplacement() выполняет копирование текста между совпадениями, затем StringBuffer#append() добавляет заменяющий текст без фальсификации. Это особенно удобно, если вы генерируете заменяющий текст динамически, как в '1008 * Rewriter .

Эллиотта Хьюза.
4 голосов
/ 04 июня 2009

Я заставил его работать со следующими, но мне больше нравится решение Тома Хоутина: -)

private static Pattern escapePattern = Pattern.compile("\\$|\\\\");
replacement = escapePattern.matcher(replacement).replaceAll("\\\\$0");
matcher.appendReplacement(stringbuffer, replacement);

Том решения:

matcher.appendReplacement(stringbuffer, Matcher.quoteReplacement(replacement));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...