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 タグ解析の処理のためです。