我查看了Java API和一些常見的第三方庫,但是我找不到合適的方法來執行String.replaceAll所做的操作,除了StringBuilder。replaceAll爲StringBuilder與正則表達式的支持?
我知道只要做一點工作,就可以爲StringBuffer完成工作,但我不想因爲StringBuffer慢而走上這條路。
有誰知道任何第三方實用程序,或者如果有一段代碼來實現此功能?
我查看了Java API和一些常見的第三方庫,但是我找不到合適的方法來執行String.replaceAll所做的操作,除了StringBuilder。replaceAll爲StringBuilder與正則表達式的支持?
我知道只要做一點工作,就可以爲StringBuffer完成工作,但我不想因爲StringBuffer慢而走上這條路。
有誰知道任何第三方實用程序,或者如果有一段代碼來實現此功能?
Apache Harmony Matcher source code似乎完全可以重新使用,與StringBuilder
一起使用,而不是當前使用的StringBuffer
,只需移動到不同的包。它似乎不會拖垮它的很多依賴。即使是商業項目,在文件開頭的Apache許可也許並不壞。
GNU Classpath代碼也可以重複使用,但許可證在那裏比較困難(您需要發佈Matcher的更改版本,但可能不是代碼的其餘部分)。在OpenJDK項目中,原始Sun的實現可以找到here。
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
。
我不確定OP是否是這樣的,因爲'm.relaceAll'將在內部使用StringBuffer並且用替換後的數據返回String。我相信OP想知道是否有一種方法可以使用StringBuilder而不是StringBuffer,就像我們在'Matcher#appendReplacement()'中使用它一樣,但我可能是錯的。 OP評論在這裏會更好。 – Pshemo
@Pshemo啊好吧,我不知道'Matcher'在內部使用StringBuffer。 –
基本上我有以下方法簽名:'public void replaceAll(final StringBuilder builder,final String regex,final String replacement)''。應該修改建造者的數據,而不必做任何重新調整。 –
正則表達式不修改一個可變CharSequence
內部。正則表達式解析CharSequence
返回String
,其中String
是結果。 StringBuffer
是一個例外,因爲有特殊處理 - 至於StringBuilder
是CharSequence
,您必須使用匹配結果對其進行修改。
你能做什麼,而不是:
// 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>"));
}
我不想走上這條路,因爲StringBuffer的比較慢。
真實的,但與通常的過早優化的警告,更重要的是,modern JVMs use escape analysis to remove the StringBuffer/Vector/HashTable locks在某些情況下,這樣一旦發生了優化,性能將大致相同。
是性能關鍵還是如此大的字符串將其轉換爲字符串並進行替換(並在需要時將其轉換回來)是不可能的? – Dukeling
你可以創建一個'Matcher'(可以在任何'CharSequence'上創建),然後用'appendReplacement'和'appendTail'寫一個循環來編寫你自己的'replaceAll'。 –
是的,但那個人使用StringBuffer ... – h22