在看了一些关于替换最后一个单词的不同问题之后,我没有找到一个涵盖最快方式的问题。在我的场景中,我希望在一段时间之后替换字符串的最后一位,或者在最后一个单词之后替换所有内容。
为了更好地解释,这个方法完全取代了我想要的字符串:(编辑:我根据Avinash的响应更改了正则表达式,仍在寻找更快的替代方法,因为正则表达式替换仍然很慢)
return permission.replaceAll("\\w+(?:\\.\\*)?$", "*");
示例 - >出
test.test.test -> test.test.*
test.test.* -> test.*
虽然这有效,但我正在寻找一种更快的方法来实现相同的结果。经常调用此方法,它出现在我的分析cpu结果的顶部。
答案 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+(?:\\.\\*)?$", "*");
答案 3 :(得分:0)