Самый быстрый способ заменить последнее вхождение шаблона в строке
Посмотрев на разные вопросы о замене последнего слова, я не нашел ответа на самый быстрый способ. В моем сценарии я хочу заменить последний бит строки после точки или последнее слово и все после.
Чтобы лучше объяснить, этот метод заменяет строку именно так, как я хочу: (Редактировать: я изменил регулярное выражение на основе ответа Avinash, все еще ища более быструю альтернативу, так как замена регулярного выражения все еще медленная)
return permission.replaceAll("\\w+(?:\\.\\*)?$", "*");
Пример в -> выход
test.test.test -> test.test.*
test.test.* -> test.*
Хотя это работает, я ищу более быстрый способ достижения тех же результатов. Этот метод часто вызывается, и он оказался в верхней части результатов моего процессора.
4 ответа
Просто разместите это как ответ, как это было внутри комментариев другого ответа:
Ответ от Joop Eggen:
Спасибо, что сообщили мне, Никто не знает. Путь регулярного выражения: замените сначала, конечно; и не забыть для множественных замен приватный статический финал Pattern PATTERN = Pattern,compile("\w+(?:\.\*)?$"); ... s = PATTERN.matcher(s).replaceFirst("*");
Свидетельство: http://ideone.com/vsObMZ Шаблон пока является самым быстрым методом, так что это будет принятый ответ.
Pattern p = Pattern.compile("\\w+(?:\\.\\*)?$");
return p.matcher(permission).replaceFirst("*");
static String lastWord(String s) {
if (s.endsWith(".*")) {
s = s.substring(0, s.length() - 2);
}
int pos = s.lastIndexOf('.') + 1;
return s.substring(0, pos) + '*';
}
Регулярное выражение медленное. Вы могли бы использовать Pattern.compile
сделать глобальный шаблон для ускорения, но здесь проще не использовать регулярное выражение.
Вам не нужен оператор чередования здесь. Положил \\.\\*
внутри не захватывающей группы после \\w+
и сделать его необязательным, добавив ?
квантификатор рядом с этой группой. При необходимости используйте группы захвата. То есть эта замена не потребует группы захвата для захвата символов, которые будут переданы позже. Эти модификации должны уменьшить время обработки.
string.replaceAll("\\w+(?:\\.\\*)?$", "*");