我有我的控制台(下图),并且我有一个命令将所有 oldstinrg 替换为 newstring。但我如何计算其中有多少被替换了?
(如果代码仅将 a 替换为 b 一次,则值为 1,但如果将 a 替换为 b 两次,则值为 2)
(这只是代码的一部分,但不需要其他部分或与这部分代码有任何关系)
else if(intext.startsWith("replace ")){
String[] replist = original.split(" +");
String repfrom = replist[1];
String repto = replist[2];
lastorep = repfrom;
lasttorep = repto;
String outtext = output.getText();
String newtext = outtext.replace(repfrom, repto);
output.setText(newtext);
int totalreplaced = 0; //how to get how many replaced strings were there?
message("Total replaced: " + totalreplaced + " from " + repfrom + " to " + repto);
}
您的当前接受的答案几乎没有问题。
每次调用
replaceFirst
时都需要从字符串开头进行迭代,因此效率不是很高。
但更重要的是它可以返回“意外”的结果。例如,当我们想用
"ab"
替换 "a"
时,对于字符串 "abbb"
接受的解决方案而不是 1
将返回 3
匹配。发生这种情况是因为:
"abbb"
将变成"abb"
"abb"
将变成"ab"
"ab"
将变成 "a"
。因此,由于我们进行了 3 次迭代,
counter
将是 3
,这就是将返回的值,而不是 1
,这是正确的结果。
为了避免此类问题并仅计算 original 字符串中的 valid 替换,我们可以使用
Matcher#appendReplacement
和 Matcher#appendTail
。
演示:
String outtext = "abb abbb";
String repfrom = "ab";
String repto = "b";
Pattern p = Pattern.compile(repfrom, Pattern.LITERAL);
Matcher m = p.matcher(outtext);
int counter = 0;
StringBuffer sb = new StringBuffer();
while (m.find()) {
counter++;
m.appendReplacement(sb, repto);
}
m.appendTail(sb);
String newtext = sb.toString();
System.out.println(newtext);
System.out.println(counter);
结果:
bb bbb
2
你可以使用 String.replaceFirst 并自己计算:
String outtext = output.getText();
String newtext = outtext;
int totalreplaced = 0;
//check if there is anything to replace
while( !newtext.replaceFirst(repfrom, repto).equals(newtext) ) {
newtext = newtext.replaceFirst(repfrom, repto);
totalreplaced++;
}
message("Total replaced: " + totalreplaced + " from " + repfrom + " to " + repto);