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

时间:2015-01-29 02:28:39

标签: java regex string replace replaceall

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

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

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

示例 - >出

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

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

4 个答案:

答案 0 :(得分:2)

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

Joop Eggen的回答:

  

感谢让我知道,一个人永远不会知道。正则表达方式:当然是替换第一;并且不要忘记多次替换私有静态最终模式PATTERN =模式,编译(“\ w +(?:\。\ *)?$”); ... s = PATTERN.matcher(s).replaceFirst(“*”);

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

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

答案 1 :(得分:1)

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为加速创建一个全局模式,但是这里不使用正则表达式更简单。

答案 2 :(得分:0)

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

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

DEMO

答案 3 :(得分:0)

^(.+\.(?=\w)).*

试试这个。$1*。见。演示。

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