2012-04-23 183 views
0

我用matcher實現了replaceAll()方法,它用「」替換了所有的標點符號。但它總是會拋出一個異常:「java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:6java:如何實現StringBuilder的replaceAll方法

private static StringBuilder filterPunctuation(StringBuilder sb){ 
    Pattern pattern = Pattern.compile("(\\.)"); 
    Matcher matcher = pattern.matcher(sb); 
    while(matcher.find()){ 
     sb.replace(matcher.start(), matcher.end(), ""); 
// if sb.replace(matcher.start(),matcher.end()," "), it wil be right, but I want replace all punction with "" 
    } 
    return sb; 
} 

public static void main(String[] args){ 
    System.out.println(filterPunctuation(new StringBuilder("test.,."))); 
} 
+0

你爲什麼不在這裏展示你的實現? – noMAD 2012-04-23 04:19:25

+2

你爲什麼要那樣做?爲什麼不使用那裏的API呢?或者是這個「家庭作業」,在這種情況下,請添加標籤請 – Bohemian 2012-04-23 04:20:05

+2

@Bohemian:沒有替換所有的StringBuilder(當然,通過字符串,我猜沒有失去很多)。 – Thilo 2012-04-23 04:23:58

回答

6

如果你要改變的StringBuilder(尤其是其長度除去字符)的內循環,你將需要獲得一個新的匹配器(因爲舊的將繼續查看原始緩衝區或兩者不一致的混合)。

Take a look at how Jon Skeet would do it

+0

這對我很有幫助。現在我知道如何去做。 – remy 2012-04-23 05:14:53

2

我會假設這做的伎倆

private static void filterPunctuation(StringBuilder sb) 
{ 
    int l=sb.length(); 
    for (int i=0; i<l; i++) if (sb.charAt(i)=='.') sb.deleteCharAt(l--); 
} 

無需返回它,你是在相同的參考工作。

+0

+1我喜歡簡單。你應該修改你的代碼,以顯示它如何處理逗號,括號等。 – Bohemian 2012-04-23 05:03:53

+0

這可能會變得很醜陋。鏈;)雷米的原始代碼到目前爲止沒有考慮到它們,因此我省略了它們 – 2012-04-23 05:05:49

相關問題