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

Java 替换字符串中最后一次出现的模式的最快方法,java,regex,string,replace,replaceall,Java,Regex,String,Replace,Replaceall,在看了一些关于替换最后一个单词的不同问题后,我没有找到一个能涵盖最快方式的问题。在我的场景中,我想替换句点后字符串的最后一位,或者替换句点后的最后一个单词和所有内容 为了更好地解释,这个方法完全按照我想要的方式替换字符串:(编辑:我根据Avinash的响应更改了正则表达式,仍然在寻找更快的替代方法,因为正则表达式replaceall仍然很慢) 输入->输出示例 test.test.test -> test.test.* test.test.* -> test.* 虽然这是可行的,但

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

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

输入->输出示例

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

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

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

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

正则表达式速度很慢。您可以使用
Pattern.compile
创建一个全局加速模式,但这里不使用regex更简单

^(.+\.(?=\w)).*
尝试此操作。替换为
$1*
。请参阅演示


仅将此作为一个答案发布,因为它位于另一个答案的评论中:

约普·艾根的答复:


谢谢你让我知道,没人知道。regex方式:当然是先替换;不要忘记,对于多个替换,私有静态final Pattern=Pattern,compile(“\w+(?:\.\*)?$”)。。。s=PATTERN.matcher.replaceFirst(“*”)

证据:模式被证明是迄今为止最快的方法,这将是公认的答案

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

哦,不,我回答了你原来的问题。好的,如果有人回答说,这是比“\\w+(?:\\\.\\*)?$”更快的方法,那么您可以将问题更改为“我基于此正则表达式更改了正则表达式。我仍在寻找更快的方法”?这不是正确的行为。还原您的编辑。再等一段时间。有人可能会提出比我更为复杂的解决方案。您是否应该重新使用编译后的模式?如果正则表达式没有改变,那么找到正则表达式模式,编译并重用它。我这样做了,它对所需时间没有显著影响。它确实更低,但还远远不够。这并没有通过我上面发布的两个测试。当输入test.test.*您的代码将在输出test时输出相同的内容。*好的,到目前为止这是最快的方法,但我会等几天再接受答案。谢谢您让我知道,没人知道。正则表达式方式:
replaceFirst
当然;不要忘记多次替换
private static final Pattern=Pattern,编译(“\\w+(?:\\\.\\*)?$”)。。。s=PATTERN.matcher.replaceFirst(“*”)^(.+\.(?=\w)).*
Pattern p = Pattern.compile("\\w+(?:\\.\\*)?$");
return p.matcher(permission).replaceFirst("*");