是否有一种使用StringBuilder替代StringBuffer的Matcher.appendReplacement()和Matcher.appendTail()的替代方案?
有没有一种“简单”的方法,可以将调用Matcher时使用StringBuffer的Java代码转换为使用StringBuilder呢?
谢谢, 詹姆斯
是否有一种使用StringBuilder替代StringBuffer的Matcher.appendReplacement()和Matcher.appendTail()的替代方案?
有没有一种“简单”的方法,可以将调用Matcher时使用StringBuffer的Java代码转换为使用StringBuilder呢?
谢谢, 詹姆斯
Matcher.appendReplacement(StringBuilder,String)
和Matcher.appendTail(StringBuilder)
方法添加到API中。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());
StringBuilder
重载方法,可以在此处看到链接。不过,使用旧的方法签名时被阻塞的风险是很小的,因为你必须在多个线程上调用相同的 StringBuffer
的 appendReplacement
方法,这本身就意味着设计有问题。 - Menaprivate static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\$\\{(\\w+)}");
Matcher matcher = PLACEHOLDER_PATTERN.matcher(value)
if(matcher.find()){
StringBuilder sb = new StringBuilder();
while (p.matcher.find()) {
String key = p.matcher.group(1);
Object obj = getObject(key, map);
p.matcher.appendReplacement(sb, obj.toString());
}
p.matcher.appendTail(sb);
return sb.toString;
}
Matcher.appendReplacement()
的代码吗?太复杂了,难以置信。 - kevinarpeString
。 - Maarten Bodewes