2015-05-13 7 views
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> 
} 

ответ

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 

Причиной 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()); 
    } 

} 

Сист em.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> 
} 
Смежные вопросы