首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuilder的Java Matcher.appendReplacement()和Matcher.appendTail()?

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

Stack Overflow用户
提问于 2016-07-14 22:13:23
回答 2查看 3.5K关注 0票数 6

有没有Matcher.appendReplacement()和Matcher.appendTail()的替代品,它接受StringBuilder而不是StringBuffer?

有没有一种“简单”的方法来“转换”Java代码,用StringBuffer调用Matcher来使用StringBuilder呢?

谢谢,詹姆斯

EN

回答 2

Stack Overflow用户

发布于 2017-01-26 01:55:32

简而言之,还没有。直到Java9。在Java9中,API中添加了Matcher.appendReplacement(StringBuilder,String)Matcher.appendTail(StringBuilder)方法。

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

代码语言:javascript
复制
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());

即使你需要群体替代,它也会变得“适度”困难:

代码语言:javascript
复制
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());
票数 8
EN

Stack Overflow用户

发布于 2016-07-14 22:18:33

简而言之,不是。

这与撰写本文时最新的Java8中的API一致。

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

例如:

代码语言:javascript
复制
matcher.appendReplacement(
    new StringBuffer(yourOriginalStringBuilder), "yourReplacement"
);

编辑

从Java9开始,重载就可用了,它使用StringBuilder代替-请参阅here接口。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38376584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档