replaceAll for StringBuilder 与正则表达式支持?

2022-09-03 06:54:05

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

我知道通过一点点工作,它可以为StringBuffer完成,但我不想走这条路,因为StringBuffer更慢。

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


答案 1

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

此外,可以使用正则表达式方法完成的任何操作都可以在 .美的是,s 的工作不仅仅是 s: s 可以为任何(接口,由 、 和 实现)获得。因此,您只需执行以下操作:StringMatcherMatcherStringMatcherCharSequenceStringBuilderStringBufferStringCharBuffer

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

工作演示。


答案 2

正则表达式不会在内部修改可变组件。正则表达式解析 a 以返回 一个 ,其中 是结果。 是一个例外,因为有特殊的处理 - 至于 ,你必须用匹配结果修改它。CharSequenceCharSequenceStringStringStringBufferStringBuilderCharSequence

您可以执行的操作:

// 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>"));
}

查看测试代码演示!