Подтвердить что ты не робот

Самый эффективный способ использования замены нескольких слов в строке

В настоящий момент я делаю

Пример:

line.replaceAll(",","").replaceAll("cat","dog").replaceAll("football","rugby");

Я думаю, что это уродливо. Не уверен, что это лучший способ сделать это? Может быть, через хэш-карту?

EDIT:

К эффективности я имею в виду лучший стиль кода и гибкость

4b9b3361

Ответ 1

Эта функциональность уже реализована в Commons Lang StringUtils class.

StringUtils.replaceEach(String text, String[] searchList, String[] replacementList)

Ответ 2

Вы можете использовать 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 и принять решение о фактической замене, основанной на фактическом совпадении внутри цикла.

Вы можете сделать более гибкие вещи таким образом, например, заменить все десятичные числа шестнадцатеричными числами или аналогичными операциями.

Это не так коротко и просто, как ваш код, но вы можете создавать с ним короткие и простые методы.

Ответ 3

Кроме того, фактическая замена внутренне преобразована в regex, я думаю, что подход прекрасен. Внережимная реализация может быть найдена в StringUtils.replace(..).

Посмотрев, какие альтернативы могут быть, вам все равно нужно что-то определить пары строк. Это может выглядеть так:

MultiReplaceUtil.replaceAll{line, 
       {",", ""}, {"cat", "dog"}, {"football", "rugby"}};

или, возможно,

MapReplaceUtil(String s, Map<String, String> replacementMap);

или даже

ArrayReplaceUtil(String s, String[] target, String[] replacement);

ни один из них не кажется мне более интуитивным с точки зрения практики кодирования.

Ответ 4

Для любителей Scala:

"cat".r.replaceAllIn("one cat two cats in the yard", m => "dog")

С помощью m вы даже можете параметризовать свою замену.