2013-06-28 13 views
13

我查看了Java API和一些常見的第三方庫,但是我找不到合適的方法來執行String.replaceAll所做的操作,除了StringBuilder。replaceAll爲StringBuilder與正則表達式的支持?

我知道只要做一點工作,就可以爲StringBuffer完成工作,但我不想因爲StringBuffer慢而走上這條路。

有誰知道任何第三方實用程序,或者如果有一段代碼來實現此功能?

+0

是性能關鍵還是如此大的字符串將其轉換爲字符串並進行替換(並在需要時將其轉換回來)是不可能的? – Dukeling

+1

你可以創建一個'Matcher'(可以在任何'CharSequence'上創建),然後用'appendReplacement'和'appendTail'寫一個循環來編寫你自己的'replaceAll'。 –

+0

是的,但那個人使用StringBuffer ... – h22

回答

0

Apache Harmony Matcher source code似乎完全可以重新使用,與StringBuilder一起使用,而不是當前使用的StringBuffer,只需移動到不同的包。它似乎不會拖垮它的很多依賴。即使是商業項目,在文件開頭的Apache許可也許並不壞。

GNU Classpath代碼也可以重複使用,但許可證在那裏比較困難(您需要發佈Matcher的更改版本,但可能不是代碼的其餘部分)。在OpenJDK項目中,原始Sun的實現可以找到here

3

String.replaceAll只是Matcher.replaceAll的一種簡便方法。 Matcher是在Java中使用正則表達式的「實際」方法,它允許使用更復雜的用例。

此外,String上正則表達式方法可以完成的任何事情都可以用Matcher上的類似方法完成。美的是,Matcher s的工作不僅僅是String s:Matcher s可以通過任何CharSequence(一個接口,它由StringBuilder,StringBuffer,和CharBuffer實現)獲得。所以你可以簡單地做:

import java.util.regex.*; 

... 

StringBuilder sb = new StringBuilder(); 
sb.append("This works with StringBuffers"); 
Pattern p = Pattern.compile("\\Buffer\\B"); 
Matcher m = p.matcher(sb); 
System.out.println(m.replaceAll("uilder")); 

將輸出This works with StringBuilders

Working demo.

+0

我不確定OP是否是這樣的,因爲'm.relaceAll'將在內部使用StringBuffer並且用替換後的數據返回String。我相信OP想知道是否有一種方法可以使用StringBuilder而不是StringBuffer,就像我們在'Matcher#appendReplacement()'中使用它一樣,但我可能是錯的。 OP評論在這裏會更好。 – Pshemo

+0

@Pshemo啊好吧,我不知道'Matcher'在內部使用StringBuffer。 –

+3

基本上我有以下方法簽名:'public void replaceAll(final StringBuilder builder,final String regex,final String replacement)''。應該修改建造者的數據,而不必做任何重新調整。 –

0

正則表達式不修改一個可變CharSequence內部。正則表達式解析CharSequence返回String,其中String是結果。 StringBuffer是一個例外,因爲有特殊處理 - 至於StringBuilderCharSequence,您必須使用匹配結果對其進行修改。

你能做什麼,而不是:

// Class 
private static final Pattern MY_PATTERN = Pattern.compile("my|regex"); 

{ // Method 
    StringBuilder builder; 
    // ... 

    Matcher m = MY_PATTERN.matcher(builder); 
    builder.replace(0, builder.length(), m.replaceAll("<b>$0</b>")); 
} 

View a test code demo!

相關問題