Java string.replace(old, new) 统计替换了多少个?

问题描述 投票:0回答:2

我有我的控制台(下图),并且我有一个命令将所有 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);

            }

My console image

java string replace command
2个回答
7
投票

您的当前接受的答案几乎没有问题。

  1. 每次调用

    replaceFirst
    时都需要从字符串开头进行迭代,因此效率不是很高。

  2. 但更重要的是它可以返回“意外”的结果。例如,当我们想用

    "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

6
投票

你可以使用 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);
© www.soinside.com 2019 - 2024. All rights reserved.