2016-10-20 39 views
0

我一直在寻找简单的方法来添加ID到HTML标签,并花了几个小时在这里跳转形成一个工具到另一个之前,我想出了这个小测试解决我的问题。因此,我的冲刺积压几乎是空的,我有一些时间分享。随意清楚并享受QA要求添加ID的人员。只需更改标签,路径并运行:)java替换自动增量文件

由于今天缺乏咖啡而在这里出现了一些问题,以便制作正确的lambda ... 如何仅在单个lambda中替换第一次发生?在文件中,我有许多行具有相同的标签。

private void replace(String path, String replace, String replaceWith) { 
    try (Stream<String> lines = Files.lines(Paths.get(path))) { 
     List<String> replaced = lines 
       .map(line -> line.replace(replace, replaceWith)) 
       .collect(Collectors.toList()); 
     Files.write(Paths.get(path), replaced); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

上面是替换所有行,因为它发现文本要替换下一行。具有自动增量的repleace的适当匹配器将更好地用于此方法体内,而不是在调用之前准备replaceWith值。如果我再次需要这个,我会为你添加另一个最终版本。

最终版本不会浪费更多的时间(相绿色):

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.runners.MockitoJUnitRunner; 

import java.io.IOException; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

@RunWith(MockitoJUnitRunner.class) 
public class RepalceInFilesWithAutoIncrement { 

    private int incremented = 100; 
    /** 
    * The tag you would like to add Id to 
    * */ 
    private static final String tag = "label"; 
    /** 
    * Regex to find the tag 
    * */ 
    private static final Pattern TAG_REGEX = Pattern.compile("<" + tag + " (.+?)/>", Pattern.DOTALL); 
    private static final Pattern ID_REGEX = Pattern.compile("id=", Pattern.DOTALL); 


    @Test 
    public void replaceInFiles() throws IOException { 

     String nextId = " id=\"" + tag + "_%s\" "; 
     String path = "C:\\YourPath"; 

     try (Stream<Path> paths = Files.walk(Paths.get(path))) { 

      paths.forEach(filePath -> { 
       if (Files.isRegularFile(filePath)) { 

        try { 
         List<String> foundInFiles = getTagValues(readFile(filePath.toAbsolutePath().toString())); 
         if (!foundInFiles.isEmpty()) { 

          for (String tagEl : foundInFiles) { 
           incremented++; 
           String id = String.format(nextId, incremented); 

           String replace = tagEl.split("\\r?\\n")[0]; 
           replace = replace.replace("<" + tag, "<" + tag + id); 


           replace(filePath.toAbsolutePath().toString(), tagEl.split("\\r?\\n")[0], replace, false); 
          } 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
     System.out.println(String.format("Finished with (%s) changes", incremented - 100)); 
    } 

    private String readFile(String path) 
      throws IOException { 
     byte[] encoded = Files.readAllBytes(Paths.get(path)); 
     return new String(encoded, StandardCharsets.UTF_8); 
    } 

    private List<String> getTagValues(final String str) { 
     final List<String> tagValues = new ArrayList<>(); 
     final Matcher matcher = TAG_REGEX.matcher(str); 
     while (matcher.find()) { 
      if (!ID_REGEX.matcher(matcher.group()).find()) 
       tagValues.add(matcher.group()); 
     } 
     return tagValues; 
    } 


    private void replace(String path, String replace, String replaceWith, boolean log) { 
     if (log) { 
      System.out.println("path = [" + path + "], replace = [" + replace + "], replaceWith = [" + replaceWith + "], log = [" + log + "]"); 
     } 

     try (Stream<String> lines = Files.lines(Paths.get(path))) { 
      List<String> replaced = new ArrayList<>(); 
      boolean alreadyReplaced = false; 
      for (String line : lines.collect(Collectors.toList())) { 
       if (line.contains(replace) && !alreadyReplaced) { 
        line = line.replace(replace, replaceWith); 
        alreadyReplaced = true; 
       } 
       replaced.add(line); 
      } 
      Files.write(Paths.get(path), replaced); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

这看起来不像一个问题。请参阅[https://stackoverflow.com/help/self-answer](https://stackoverflow.com/help/self-answer)。 –

+0

totaly同意,而不是一个问题。我在这里的第一篇文章因此声誉等于我的智商,因为有人在早上6点之前醒来,所以我无法回答自己的问题。仍然发现它值得分享,因为我找不到在文件中搜索和标记修改的好例子。 –

+0

您仍然可以将其重新命名为问题,并按照链接中的建议回答您自己的问题。 –

回答

0

与Jsoup试试吧。

import org.jsoup.Jsoup; 
    import org.jsoup.nodes.Document; 
    import org.jsoup.nodes.Element; 
    import org.jsoup.select.Elements; 

    public class JsoupTest { 

     public static void main(String argv[]) { 

      String html = "<html><head><title>Try it with Jsoup</title></head>" 
          + "<body><p>P first</p><p>P second</p><p>P third</p></body></html>"; 
      Document doc = Jsoup.parse(html);   
      Elements ps = doc.select("p");  // The tag you would like to add Id to 
      int i = 12; 
      for(Element p : ps){ 
       p.attr("id",String.valueOf(i)); 
       i++; 
      } 
      System.out.println(doc.toString()); 
     } 
    }