我错过了什么,或者StringBuilder是否缺少与普通String类相同的"将所有出现的字符串A替换为字符串B"的函数?StringBuilder替换功能并不完全相同.有没有任何方法可以更有效地使用普通的String类生成多个字符串?
Jon*_*eet 74
好吧,你可以写一个循环:
public static void replaceAll(StringBuilder builder, String from, String to)
{
int index = builder.indexOf(from);
while (index != -1)
{
builder.replace(index, index + from.length(), to);
index += to.length(); // Move to the end of the replacement
index = builder.indexOf(from, index);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在某些情况下lastIndexOf,从后面开始使用可能会更快.我怀疑如果你用一个短字符串替换长字符串就是这种情况 - 所以当你开始时,任何替换都要少复制.无论如何,这应该给你一个起点.
Ron*_*ero 34
你可以使用Pattern/Matcher.来自Matcher javadocs:
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)
Alf*_*rio 12
查看String类的replaceAll方法的JavaDoc :
将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换.调用str.replaceAll(regex,repl)形式的此方法会产生与表达式完全相同的结果
java.util.regex.Pattern.compile(正则表达式).matcher(STR).replaceAll(REPL)
如您所见,您可以使用Pattern和Matcher来执行此操作.
小智 12
@Adam:我认为在你的代码片段中你应该跟踪m.find()的起始位置,因为字符串替换可能会在最后一个字符匹配后更改偏移量.
public static void replaceAll(StringBuilder sb, Pattern pattern, String replacement) {
Matcher m = pattern.matcher(sb);
int start = 0;
while (m.find(start)) {
sb.replace(m.start(), m.end(), replacement);
start = m.start() + replacement.length();
}
}
Run Code Online (Sandbox Code Playgroud)
Pau*_*gas 11
这个类org.apache.commons.lang3.text.StrBuilder中的Apache Commons Lang中允许更换:
public StrBuilder replaceAll(String searchStr, String replaceStr)
Run Code Online (Sandbox Code Playgroud)
*这不会收到正则表达式,而是一个简单的字符串.
小智 6
即使是简单的也是使用String ReplaceAll函数本身.你可以把它写成
StringBuilder sb = new StringBuilder("Hi there, are you there?")
System.out.println(Pattern.compile("there").matcher(sb).replaceAll("niru"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100651 次 |
| 最近记录: |