[英]Trim a possible prefix of a string in Java
我有String str
,我想从中提取除了可能的前缀"abc"
之外的子字符串。
首先想到的解决方案是:
if (str.startsWith("abc"))
return str.substring("abc".length());
return str;
我的问题是:
使用split
和"abc"
前缀的正则表达式是否有“更清洁”的方法?
如果是,它的效率是否低于上述方法(因为它在整个字符串中搜索)?
如果是的话,有没有更好的方法(“更好的方式”=清洁和有效的解决方案)?
请注意, "abc"
前缀可能出现在字符串的其他位置,不应删除。
谢谢
这行代码比上面的代码短:
return str.replaceFirst("^abc", "");
但就性能而言,我猜两个代码之间不会有任何实质性差异。 一个使用正则表达式,一个不使用正则表达式,但搜索和子串。
使用String.replaceFirst
和^abc
(匹配前导abc
)
"abcdef".replaceFirst("^abc", "") // => "def"
"123456".replaceFirst("^abc", "") // => "123456"
"123abc456".replaceFirst("^abc", "") // => "123abc456"
String#split
可以做到这一点,但它不是更好的解决方案。 实际上它会模糊不清,我不建议将它用于此目的。 startsWith
。 String#startsWith
是为此设计的。 您可以轻松测量代码运行所需的时间。 在这里你可以做什么:
创建一个大循环,在其中你可以将它的计数器附加到一些虚拟字符串以模拟你想要检查的字符串,然后尝试使用startsWith
一次,并在之后replaceAll
:
for(int i = 0;i<900000;i++) {
StringBuilder sb = new StringBuilder("abc");
sb.append(i);
if(sb.toString().startsWith("abc")) { ... }
}
long time = System.currentTimeMillis() - start;
System.out.println(time); //Prints ~130
for(int i = 0;i<900000;i++){
StringBuilder sb = new StringBuilder("abc");
sb.append(i);
sb.toString().replaceAll("^abc", "");
}
long time = System.currentTimeMillis() - start;
System.out.println(time); //Prints ~730
试试这个
str = str.replaceAll("^abc", "");
一个无正则表达式的解决方案(我需要这个,因为我正在移除的字符串是可配置的并包含反斜杠,需要转义才能在正则表达式中直接使用):
Apache Commons Lang StringUtils.removeStart(str, remove)
将使用String.startsWith
和String.substring
从str
的开头删除remove
。
该方法的源代码是提供信息的:
public static String removeStart(final String str, final String remove) {
if (isEmpty(str) || isEmpty(remove)) {
return str;
}
if (str.startsWith(remove)){
return str.substring(remove.length());
}
return str;
}
如果您担心性能,可以使用相同的预编译前缀Pattern
来匹配多个字符串str.replaceFirst("^abc", "")
从而改进str.replaceFirst("^abc", "")
解决方案。
final Pattern prefix = Pattern.compile("^abc"); // Could be static constant etc
for ... {
final String result = prefix.matcher(str).replaceFirst("");
}
我想如果你从很多字符串中剥离相同的前缀,那么差别将是显而易见的。
就效率而言,您可以使用StringBuilder
,其中您对一个字符串有多个操作,例如substring,查找索引,然后查找子字符串等。
在清洁度/效率方面,可以使用StringUtils (Apache Commons Lang)
。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.