用可变的替换字符串替换一个子字符串

3
我将尝试编写一个小程序,用于检测代码文件中的注释,并通过索引标签进行标记,即具有递增值的标签。
例如,以下是输入内容:
method int foo (int y) { 
    int temp; // FIRST COMMENT
    temp = 63; // SECOND COMMENT
    // THIRD COMMENT
}

应该更改为:

method int foo (int y) { 
    int temp; <TAG_0>// FIRST COMMENT</TAG>
    temp = 63; <TAG_1>// SECOND COMMENT</TAG>
    <TAG_2>// THIRD COMMENT</TAG>
}

我尝试了以下代码:
    String prefix, suffix;
    String pattern = "(//.*)";

    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(fileText);

    int i = 0;
    suffix = "</TAG>";

    while (m.find()) {
        prefix = "<TAG_" + i + ">";
        System.out.println(m.replaceAll(prefix + m.group() + suffix));
        i++;
    }

以上代码的输出结果为:
method int foo (int y) { 
    int temp; <TAG_0>// FIRST COMMENT</TAG>
    temp = 63; <TAG_0>// SECOND COMMENT</TAG>
    <TAG_0>// THIRD COMMENT</TAG>
}
3个回答

2
为了替换检测到的模式,您应该使用Matcher#appendReplacement方法来填充StringBuffer:
StringBuffer sb = new StringBuffer();
while (m.find()) {
    prefix = "<TAG_" + i + ">";
    m.appendReplacement(sb, prefix + m.group() + suffix);
    i++;
}
m.appendTail(sb); // append the rest of the contents
< p > replaceAll 会执行错误的替换是因为它将使 Matcher 扫描整个字符串,用 <TAG_0>...</TAG> 替换每个匹配的模式。实际上,循环只会执行一次。


0

你有试过逐行读取文件吗,就像这样:

    String prefix, suffix;
    suffix = " </TAG>";
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        int i = 0;
        for (String line; (line = br.readLine()) != null;) {
            if (line.contains("//")) {
                prefix = "<TAG_" + i + ">//";
                System.out.println(line.split("//*")[0] + " " + prefix +  line.split("//*")[1] + suffix);
                i++;
            }
         }

} catch (IOException e) {
}

0

fichiertexte.txt:

method int foo (int y) { 
    int temp; // FIRST COMMENT
    temp = 63; // SECOND COMMENT
    // THIRD COMMENT
}

App.java:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class App {

    public static void main(String[] args) {

        String fileText = "";
        String fichier = "fichiertexte.txt";

        // lecture du fichier texte
        try {
            InputStream ips = new FileInputStream(fichier);
            InputStreamReader ipsr = new InputStreamReader(ips);
            BufferedReader br = new BufferedReader(ipsr);
            String ligne;
            while ((ligne = br.readLine()) != null) {
                //System.out.println(ligne);
                fileText += ligne + "\n";
            }
            br.close();
        } catch (Exception e) {
            System.err.println(e.toString());
        }

        String prefix, suffix;
        String pattern = "(//.*)";

        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(fileText);

        int i = 0;
        suffix = "</TAG>";

        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            prefix = "<TAG_" + i + ">";
            m.appendReplacement(sb, prefix + m.group() + suffix);
            i++;
        }
        System.out.println(sb.toString());
    }

}

System.out :

method int foo (int y) { 
    int temp; <TAG_0>// FIRST COMMENT</TAG>
    temp = 63; <TAG_1>// SECOND COMMENT</TAG>
    <TAG_2>// THIRD COMMENT</TAG>
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接