Presen
Presen

Reputation: 1857

Replace a substring by a changing replacement string

I'm trying to write a small program that detect comments in a code file, and tag them by a index-tag, meaning a tag with an increasing value.
For example this input:

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

should be change to:

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

I tried the following code:

    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++;
    }

The output for the above code is:

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

Upvotes: 3

Views: 75

Answers (3)

St&#233;phane GRILLON
St&#233;phane GRILLON

Reputation: 11864

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>
}

Upvotes: 0

ikonia
ikonia

Reputation: 36

Have you tried reading the file per line, like:

    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) {
}

Upvotes: 0

M A
M A

Reputation: 72844

To replace occurrences of detected patterns, you should use the Matcher#appendReplacement method which fills a 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

The reason replaceAll will do the wrong replacement is that it will have the Matcher scan the whole string to replace every matched pattern with <TAG_0>...</TAG>. In effect, the loop would only execute once.

Upvotes: 2

Related Questions