我查看了Java API和一些常见的第三方库,但是我找不到一个合适的方法来执行String.replaceAll所做的事情,除了StringBuilder。
我知道有一点工作,可以为StringBuffer完成,但我不想走这条路,因为StringBuffer比较慢。
有没有人知道任何第三方实用程序,或者是否有快速代码来实现此功能?
答案 0 :(得分:8)
String.replaceAll
只是Matcher.replaceAll
的一种便捷方法。 Matcher
是在Java中使用正则表达式的“实际”方式,允许更复杂的用例。
此外,String
上使用正则表达式方法可以完成的任何操作都可以使用Matcher
上的类似方法完成。美妙的是,Matcher
可以为String
提供更多Matcher
s CharSequence
s StringBuilder
(一个接口,由{{1}实现},StringBuffer
,String
和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
。
答案 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
是一个例外,因为有特殊处理 - 至于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>"));
}