簡體   English   中英

在Java中修剪字符串的可能前綴

[英]Trim a possible prefix of a string in Java

我有String str ,我想從中提取除了可能的前綴"abc"之外的子字符串。

首先想到的解決方案是:

if (str.startsWith("abc"))
    return str.substring("abc".length());
return str;

我的問題是:

  1. 使用split"abc" 前綴的正則表達式是否有“更清潔”的方法?

  2. 如果是,它的效率是否低於上述方法(因為它在整個字符串中搜索)?

  3. 如果是的話,有沒有更好的方法(“更好的方式”=清潔和有效的解決方案)?

請注意, "abc"前綴可能出現在字符串的其他位置,不應刪除。

謝謝

這行代碼比上面的代碼短:

return str.replaceFirst("^abc", "");

但就性能而言,我猜兩個代碼之間不會有任何實質性差異。 一個使用正則表達式,一個不使用正則表達式,但搜索和子串。

使用String.replaceFirst^abc (匹配前導abc

"abcdef".replaceFirst("^abc", "")     // => "def"
"123456".replaceFirst("^abc", "")     // => "123456"
"123abc456".replaceFirst("^abc", "")  // => "123abc456"
  1. 使用String#split可以做到這一點,但它不是更好的解決方案。 實際上它會模糊不清,我不建議將它用於此目的。
  2. 在這種情況下,不要浪費時間關注效率,它並不重要,注重邏輯和清晰度。 但請注意,使用正則表達式通常較慢,因為它涉及額外的操作,因此您可能希望保持startsWith
  3. 你的方法很好,如果你想檢查String是否以“abc”開頭, 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.startsWithString.substringstr的開頭刪除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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM