2016-10-20 10 views
0

IDをHTMLタグに追加する簡単な方法を探していましたが、この小さなテストで問題を解決する前に、フォームツールを別のツールにジャンプするのに数時間を費やしました。したがって、私のスプリントバックログはほとんど空です。私は時間を共有しています。 IDを追加するには、QAによって要求された人を喜ばせてください。タグ、パスを変更して実行してください:)java自動インクリメントでファイルを置き換えます。

今日のコーヒーの不足のために適切なラムダを作るためにここにいくつかの問題がありました... シングルラムダで最初のオカレンスだけを置き換える方法は?ファイル内には同じタグを持つ行がたくさんありました。

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(); 
    } 
} 

上記の行は、次の行に置き換えるテキストがあるため、すべての行を置き換えていました。オートインクリメントを持つ適切なマッチャーは、呼び出し前に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

が全然同意して、質問ではありません。ここで私の最初の投稿は評判が私のIQに等しいです。誰かが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()); 
     } 
    } 
関連する問題