Ответ 1
Эта функциональность уже реализована в Commons Lang StringUtils
class.
StringUtils.replaceEach(String text, String[] searchList, String[] replacementList)
В настоящий момент я делаю
Пример:
line.replaceAll(",","").replaceAll("cat","dog").replaceAll("football","rugby");
Я думаю, что это уродливо. Не уверен, что это лучший способ сделать это? Может быть, через хэш-карту?
EDIT:
К эффективности я имею в виду лучший стиль кода и гибкость
Эта функциональность уже реализована в Commons Lang StringUtils
class.
StringUtils.replaceEach(String text, String[] searchList, String[] replacementList)
Вы можете использовать Matcher.appendReplacement()
/appendTail()
для создания очень гибких функций поиска и замены.
Пример в JavaDoc выглядит следующим образом:
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());
Теперь внутри цикла while
вы можете сами решить, что такое заменяющий текст, и основывать эту информацию на фактическом содержимом.
Например, вы можете использовать шаблон (,|cat|football)
для соответствия ,
, cat
или football
и принять решение о фактической замене, основанной на фактическом совпадении внутри цикла.
Вы можете сделать более гибкие вещи таким образом, например, заменить все десятичные числа шестнадцатеричными числами или аналогичными операциями.
Это не так коротко и просто, как ваш код, но вы можете создавать с ним короткие и простые методы.
Кроме того, фактическая замена внутренне преобразована в regex
, я думаю, что подход прекрасен. Внережимная реализация может быть найдена в StringUtils.replace(..).
Посмотрев, какие альтернативы могут быть, вам все равно нужно что-то определить пары строк. Это может выглядеть так:
MultiReplaceUtil.replaceAll{line,
{",", ""}, {"cat", "dog"}, {"football", "rugby"}};
или, возможно,
MapReplaceUtil(String s, Map<String, String> replacementMap);
или даже
ArrayReplaceUtil(String s, String[] target, String[] replacement);
ни один из них не кажется мне более интуитивным с точки зрения практики кодирования.
Для любителей Scala:
"cat".r.replaceAllIn("one cat two cats in the yard", m => "dog")
С помощью m
вы даже можете параметризовать свою замену.