3

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

            }

我的控制台图像

4

2 回答 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);
于 2013-06-20T16:19:13.723 回答
5

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

  1. 每次调用时都需要从字符串的开头进行迭代,replaceFirst因此效率不高。
  2. 但更重要的是它可以返回“意外”的结果。例如,当我们要替换"ab""a", for string"abb"方法时,而不是1将返回结果2匹配。它发生是因为:

    • 第一次迭代后"abb"变成"ab"
    • "ab"可以再次匹配,将再次匹配和替换。

    也就是说替换"ab"->"b" "abb"会演变成."a"


为了解决这些问题并在一次迭代中获得替换计数,您可以使用类似Matcher#appendReplacementMatcher#appendTail方法

String outtext = "Some text with word text and that will need to be " +
        "replaced with another text x";
String repfrom = "text";
String repto = "[replaced word]";

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);
于 2013-06-20T16:45:55.100 回答