替换字符串中最后一次出现的模式的最快方法

Fastest way to replace last occurrence of pattern in a string

在查看了有关替换最后一个词的不同问题后,我没有找到涵盖最快方式的问题。在我的场景中,我想在一段时间后替换字符串的最后一位,或者最后一个单词和之后的所有内容。

为了更好地解释,此方法完全按照我想要的方式替换了字符串:(编辑:我根据 Avinash 的响应更改了正则表达式,仍在寻找更快的替代方法,因为正则表达式 replaceall 仍然很慢)

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

示例输入 -> 输出

test.test.test -> test.test.*
test.test.* -> test.*

虽然这可行,但我正在寻找一种更快的方法来实现相同的结果。此方法经常被调用,它出现在我的分析 cpu 结果的顶部。

这里不需要交替运算符。将 \.\* 放在 \w+ 之后的非捕获组中,并通过在该组旁边添加 ? 量词使其成为可选的。如有必要,使用捕获组。也就是说,此替换不需要捕获组来捕获稍后要引用的字符。这些修改必须减少处理时间。

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

DEMO

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)).*

通过 * 尝试 this.Replace。查看演示。

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

只是将此作为答案发布,因为它在另一个答案的评论中:

Joop Eggen 的回答:

Thanks for letting me know, One never knows. The regex way: replaceFirst of course; and not to forget for multiple replacements private static final Pattern PATTERN = Pattern,compile("\w+(?:\.\*)?$"); ... s = PATTERN.matcher(s).replaceFirst("*");

证据:http://ideone.com/vsObMZ模式被证明是迄今为止最快的方法,因此这将是公认的答案。

Pattern p = Pattern.compile("\w+(?:\.\*)?$");
return p.matcher(permission).replaceFirst("*");