csdn有个兄弟写了一段代码实现替换TXT文件里的字符串,一行一行查找替换,不过我想替换成变量,比如一篇文章,查找到有10个单词love,然后分别把第一个"love"替换成"love 1",第二个替换成"love 2",以此类推,如何修改下面的代码实现这个功能?替换TXT文件里的字符串,一行一行查找替换,java代码:
    package com.play.code;  
      
    import java.io.BufferedReader;  
    import java.io.File;  
    import java.io.FileInputStream; //import java.io.FileNotFoundException;  
    //import java.io.FileReader;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.io.PrintWriter;  
      
    public class ChangeFile {  
        public static void main(String[] argv) {  
            try {  
                BufferedReader bufReader =   
                    new BufferedReader(  
                        new InputStreamReader(  
                            new FileInputStream(  
                                new File("D:/ooooo/我的周报.txt"))));  
      
                StringBuffer strBuf = new StringBuffer();  
                for (String tmp = null; (tmp = bufReader.readLine()) != null; tmp = null) {  
                    // 在这里做替换操作  
                    tmp = tmp.replaceAll("\\*", "#");  
                    tmp = tmp.replaceFirst("===", "\\* ");  
                    tmp = tmp.replaceAll("===", "");  
                    tmp = tmp.replaceAll("==", "===");  
                    strBuf.append(tmp);  
                    strBuf.append(System.getProperty("line.separator"));  
                }  
                bufReader.close();  
      
                PrintWriter printWriter = new PrintWriter("D:/ooooo/我的周报-新.txt");  
                printWriter.write(strBuf.toString().toCharArray());  
                printWriter.flush();  
                printWriter.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

解决方案 »

  1.   

    for循环前面加个 int cnt=1;
    for循环里面写:
    while (tmp.indexOf("love") >= 0) {
      tmp = tmp.replace("love", "love"+(cnt++));
    }
      

  2.   

    字符串替换函数不能做数量统计。可能一个没换,也可能换了7,8个。如果想每次遇到关键词都做不同的处理,就要有查找功能。可以使用indexOf(String str)函数,如果一个字符串中含有关键词,则返回关键词的索引值,一个没有返回-1,然后再使用indexOf(String str, int startIndex)(哪个参数在前我忘了)。为了确保替换完全,可以使用递归或者死循环。例如
    boolean firstFlg = true;
    String lineStr;
    int count = 0;
    int lastFindIndex = -1;
    while(true) {
        if (firstFlg == true) {
             if (lineStr.indexOf("love") == - 1) {
                 break;
             }
             count++;
             lastFindIndex = lineStr.indexOf("love");
             lineStr = lineStr.replaceFirst("love", "love " + count);
             firstFlg = false;
        } else {
            if (lineStr.indexOf("love", lastFindIndex + 6) == - 1) {
                 break;
             }
             count++;
             lastFindIndex = lineStr.indexOf("love", lastFindIndex + 6);
             lineStr = lineStr.replaceFirst(lastFindIndex, "love", "love " + count);
        }
    }
    具体的方法参数位置等可能不正确。反正就是这么个思路。
      

  3.   


    兄弟按照你的修改了一下之后,似乎循环有问题,cpu占用100%,一直在跑,你测试过没有?
      

  4.   

    问题在于参数其实带有重复性,所以处理起来变得复杂化了for循环前面加个 int cnt=1;
    for循环里面写:
    int pos=0;
    while ((pos = tmp.indexOf("love", pos)) >= 0) {
      tmp = tmp.substring(0, pos) + ("love" + (cnt++)) + tmp.substring((pos += "love".length()));
    }这次是测试过的,再次表示歉意 =_=
      

  5.   

    用StringBuilder吧,  StringBuilder data = new StringBuilder("xxxlovexxxlovexxxlove");
    int count = 0;
    int index = 0;
    while ((index = data.indexOf("love", index)) != -1) {
    count++;
    data.insert(index + 4, count);
    index++;
    }
    System.out.println(data);
      

  6.   

    7楼兄弟的建议挺不错的,循环中间那句话可以稍微调整下:
    while ((index = data.indexOf("love", index)) != -1) {
      data.insert((index+=4), ++count);
    }