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

Jin*_*Kim 16 java regex string stringbuilder

我查看了Java API和一些常见的第三方库,但我找不到一个合适的方法来完成String.replaceAll所做的工作,但StringBuilder除外.

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

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

Mar*_*der 8

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

此外,任何可以使用正则表达式方法String完成的操作都可以使用类似的方法来完成Matcher.的优点是,即Matchers的不仅仅是工作StringS:MatcherS可为任何能够获得CharSequence(一个接口,其通过实现StringBuilder,StringBuffer,StringCharBuffer).所以你可以简单地做:

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"));
Run Code Online (Sandbox Code Playgroud)

会输出This works with StringBuilders.

工作演示.

  • 基本上我有以下方法签名:`public void replaceAll(final StringBuilder builder,final String regex,final String replacement)`.应该修改构建器的数据,而不必进行任何重新调整. (3认同)
  • 我不确定 OP 是否用于这样的事情,因为 `m.relacAll` 将在内部使用 StringBuffer 并返回带有替换数据的 String。我相信 OP 想知道是否有一种方法可以使用 StringBuilder 而不是 StringBuffer ,就像我们在`Matcher#appendReplacement()` 中使用它一样,但我可能是错的。OP评论在这里会更好。 (2认同)

h22*_*h22 0

Apache Harmony Matcher 源代码似乎完全可以修改,StringBuilder可以代替当前使用的StringBuffer,只需移至不同的包即可。它似乎并没有拖累很多依赖性。即使对于商业项目,位于文件开头的 Apache 许可证也可能不错。

GNU 类路径代码也可以重用,但那里的许可更加困难(您需要发布匹配器的更改版本,但可能不需要发布其余代码)。与原始 Sun 的实现相同,可以OpenJDK 项目中找到。