Самый быстрый способ заменить последнее вхождение шаблона в строке

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

Чтобы лучше объяснить, этот метод заменяет строку именно так, как я хочу: (Редактировать: я изменил регулярное выражение на основе ответа 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)).*

Попробуйте это. Заменить на $1*. См. Демо.

https://regex101.com/r/dW8mK5/7

Вам не нужен оператор чередования здесь. Положил \\.\\* внутри не захватывающей группы после \\w+ и сделать его необязательным, добавив ? квантификатор рядом с этой группой. При необходимости используйте группы захвата. То есть эта замена не потребует группы захвата для захвата символов, которые будут переданы позже. Эти модификации должны уменьшить время обработки.

string.replaceAll("\\w+(?:\\.\\*)?$", "*");

DEMO

Другие вопросы по тегам