読者です 読者をやめる 読者になる 読者になる

1行の table (HTML) を Java で解析する手法について

HTML 表(tableタグ) の1行もしくは数行の tr-td タグの文字列から単純に td の
body に書かれた内容をJavaで抽出したいだけなのだが、
わざわざ、それだけの処理で SAXParser インスタンスや DOM インスタンスをつくって重くなるのが嫌になってきた。
かといって、jsoup を使って読むほど難しい trタグとtdタグなわけではない。

正規表現と Stream での処理でなんとかしてみる。

public List<String> bodyListTD(String linestr){
   Pattern tdendPattern = Pattern.compile("</td>");
   Matcher matcher = tdendPattern.matcher(linestr);
   AtomicInteger ix = new AtomicInteger(0);
   AtomicReference<String> atomics = new AtomicReference<String>(linestr);
   while(matcher.find()){
      atomics.set(matcher.replaceFirst("</td_" +ix.getAndIncrement() + ">"));
      matcher = tdendPattern.matcher(atomics.get());
   }
   Pattern tdstartPattern = Pattern.compile("<td");
   matcher = tdstartPattern.matcher(atomics.get());
   ix = new AtomicInteger(0);
   while(matcher.find()){
      atomics.set(matcher.replaceFirst("<" +ix.getAndIncrement() + "_td"));
      matcher = tdstartPattern.matcher(atomics.get());
   }
   return IntStream.range(0, ix.get()).mapToObj(i->{
      Matcher m = Pattern.compile("<" + i + "_td.+</td_" + i + ">").matcher(atomics.get());
      m.find();
      return m.group().replaceFirst("</td_" + i + ">", "").replaceFirst("<" + i + "_td.*>", "");
   }).collect(Collectors.toList());
}

Pattern インスタンスを2回作ってタグ終了と開始のループ文が2つあって最後に IntStream で見つかったタグの数分の
抽出処理をしている。
→ダサいかも?

String linestr = "<tr><td>A</td><td>B</td><td class=\"column3\">C</td><td>D</td><td>E</td><td>F</td></tr>";

に対して、、

List<String> results = bodyListTD(linestr);

results.stream().forEach(e->{
    System.out.println("[" + e + "]");
}):

結果、

[A]
[B]
[C]
[D]
[E]
[F]

最終目的は、JavaScript ばかりに 表→JSON を作らせる処理を量が多いと処理時間が心配なので
いっそのこと、サーバに table の HTML を送ってしまって読み込ませた方が、むしろ速いのでは?
と思ったので、Java での table タグ解析の処理のためです。