StringBuilder的Java Matcher.appendReplacement()和Matcher.appendTail()?

时间:2016-07-14 14:13:23

标签: java

Matcher.appendReplacement()和Matcher.appendTail()是否有替代StringBuilder而不是StringBuffer?

是否有一种“简单”的方法来“转换”使用StringBuffer调用Matcher来代替使用StringBuilder的Java代码?

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:7)

简短的回答,还没有。直到Java 9.在Java 9中,API添加了Matcher.appendReplacement(StringBuilder,String)Matcher.appendTail(StringBuilder)方法。

在此之前,如果您不需要替换字符串中的组替换,那么我仍然觉得这个解决方案“简单”:

Matcher m = PATTERN.matcher(s);
StringBuilder sb = new StringBuilder();
int pos = 0;
while(m.find()) {
    sb.append(s, pos, m.start());
    pos = m.end();
    sb.append("replacement")
}
sb.append(s, pos, s.length());

即使你需要小组替换,它也只是“适度”困难:

Matcher m = PATTERN.matcher(s);
StringBuilder sb = new StringBuilder();
int pos = 0;
while(m.find()) {
    sb.append(s, pos, m.start());
    pos = m.end();
    if (m.start(1) >= 0) {                  // check if group 1 matched
        sb.append(s, m.start(1), m.end(1)); // replace with group 1
    }
}
sb.append(s, pos, s.length());

答案 1 :(得分:2)

简短的回答,没有。

在撰写本文时,这是最新Java 8中的API

但是,其中一个重载的StringBuffer构造函数将CharSequence作为参数,StringBuilder(就像StringBuffer)IS-A CharSequence

例如:

matcher.appendReplacement(
    new StringBuffer(yourOriginalStringBuilder), "yourReplacement"
);