使用正则表达式支持的StringBuilder的replaceAll?

时间:2013-06-28 14:20:41

标签: java regex string stringbuilder

我查看了Java API和一些常见的第三方库,但是我找不到一个合适的方法来执行String.replaceAll所做的事情,除了StringBuilder。

我知道有一点工作,可以为StringBuffer完成,但我不想走这条路,因为StringBuffer比较慢。

有没有人知道任何第三方实用程序,或者是否有快速代码来实现此功能?

4 个答案:

答案 0 :(得分:8)

String.replaceAll只是Matcher.replaceAll的一种便捷方法。 Matcher是在Java中使用正则表达式的“实际”方式,允许更复杂的用例。

此外,String上使用正则表达式方法可以完成的任何操作都可以使用Matcher上的类似方法完成。美妙的是,Matcher可以为String提供更多Matcher s CharSequence s StringBuilder(一个接口,由{{1}实现},StringBufferStringCharBuffer)。所以你可以这样做:

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.

答案 1 :(得分:3)

  

我不想走这条路,因为StringBuffer比较慢。

是的,但在通常的过早优化警告中,更重要的是,modern JVMs use escape analysis to remove the StringBuffer/Vector/HashTable locks在某些情况下,所以一旦优化发生,性能将大致相同。

答案 2 :(得分:0)

Apache Harmony Matcher source code似乎完全可以与StringBuilder一起使用,而不是当前使用的StringBuffer,只需移动到不同的包。它似乎没有拖累很多依赖。即使对于商业项目,位于文件开头的Apache许可也可能不错。

GNU Classpath代码也可以重复使用,但许可证更难处理(您需要发布更改后的Matcher版本,但可能不会发布其余代码)。在OpenJDK项目中可以找到原始Sun的实现here

答案 3 :(得分: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!