2013-06-28 12 views
13

Java API'sine ve yaygın olarak kullanılan bazı üçüncü taraf kitaplıklarına baktım ancak StringBuilder dışında String.replaceAll'in yapacağı uygun bir yöntem bulamadım.replaceAll regex desteğiyle birlikte StringBuilder için mi?

Bu küçük bir çalışma ile StringBuffer için yapılabilir, ancak StringBuffer daha yavaş olduğu için bu yola çıkmak istemiyorum.

Herhangi bir üçüncü tarafın kullanımını bilen var mı, yoksa bu işlevselliği uygulamak için hızlı bir kod parçası var mı?

+0

Performansın kritik ya da büyük bir dizgeyi dizgeye dönüştürüp değiştirmeyi (ve gerekirse geri dönüştürmeyi) yapması sorun mu var? – Dukeling

+1

Sen (herhangi bir 'CharSequence' üzerinde oluşturulabilir) ve daha sonra bir döngü yazma bir' Matcher' oluşturabilir 'appendReplacement' ve' appendTail' kendi 'replaceAll' yazmak için. –

+0

Evet ama bu bir StringBuffer ... Aslında – h22

cevap

0

Apache Harmony Matcher source code, şu an kullanılan StringBuffer yerine StringBuilder ile kullanılmak üzere tamamen yeniden kullanılabilir gibi görünüyor, sadece farklı pakete geçin. Onunla çok fazla bağımlılık sürüklemiyor gibi görünüyor. Dosyanın başında bulunan Apache lisansı, ticari proje için bile kötü olmayabilir.

GNU Classpath kodu da yeniden kullanılabilir, ancak lisans burada daha zordur (Matcher'ın değiştirilmiş sürümünüzü yayınlamanız gerekir, ancak muhtemelen kodunuzun geri kalanı). OpenJDK projesinde here bulunabilir orijinal Sun'ın uygulanması hakkında aynı.

3

String.replaceAll, Matcher.replaceAll için bir kolaylık yöntemidir. Matcher, Java'da düzenli ifadeyi kullanmanın "gerçek" yoludur ve çok daha karmaşık kullanım durumlarına izin verir. Ayrıca, String numaralı belgede normal ifadelerle yapılabilecek her şey Matcher üzerinde benzer yöntemlerle yapılabilir. Matcher s herhangi CharSequence (StringBuilder, StringBuffer, String ve CharBuffer tarafından uygulanan bir arabirim) elde edilebilir: güzellik fazla s String sadece daha ile Matcher kullanıcının iş olmasıdır. Bu nedenle aşağıdakileri yapabilirsiniz: This works with StringBuilders 10 Çıktı olacaktır.

Working demo.

+0

OP böyle bir şey için emin değilim çünkü m.relaceAll 'dahili olarak StringBuffer kullanacak ve değiştirilen verilerle birlikte String döndürecektir. Ben OP biz eşleştirici # appendReplacement 'bunu()' ama yanlış olabilir kullanmak gibi yerine StringBuffer ait StringBuilder kullanmak için bir yol yoktur bilmek istiyor inanıyoruz. OP yorum burada daha iyi olurdu. – Pshemo

+0

@Pshemo ah tamam, 'Matcher'ın dahili olarak bir StringBuffer kullandığını bilmiyordum. 'Public void replaceAll (nihai StringBuilder oluşturucu, final String normal ifade, final String değiştirme)': –

+3

Temelde, aşağıdaki yöntem imzası sahiptir. Üreticinin verileri herhangi bir yeniden atama yapmak zorunda kalmadan değiştirilmelidir. –

0

Regex içten bir değişken CharSequence değiştirmez. Regex, String değerini döndürmek için CharSequence'u ayrıştırır; burada String sonuçtur. StringBuffer özel bir işlem olduğu için bir istisnadır - StringBuilderCharSequence olduğu gibi, bir eşleşme sonucu ile değiştirmeniz gerekir. Bunun yerine yapabilecekleriniz

:

// 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!