🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

1回答

1067閲覧

Java 正規表現 htmlファイル内の<title>要素</title> の要素のみを抽出したい

Pro01x19

総合スコア17

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/02/26 01:02

前提・実現したいこと

特定のフォルダからhtmlファイルのみを抽出し、読み込み、
csvファイルにファイル名とtitleの要素のみを書き込むプログラムを作成中です。

csvファイルの作成
フォルダの指定
htmlファイルのみを読み込み
htmlmファイルから<title>要素</title>を抽出
ファイル名と<title>要素</title>を書き込み

までは出来ました。

イメージ説明

この形から,<title></title>の書き込みを無くしたいのですが上手く行きません。

該当のソースコード

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.regex.Pattern; import java.util.regex.Matcher; public class App { public static void main(String[] args) throws Exception { //カレンダークラスにより現在日時を取得 Calendar c = Calendar.getInstance(); // 日時のフォーマットを設定 DateFormat myFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); // ファイル名を定義 String FileName = "index" + myFormat.format(c.getTime()); // 場所を定義し、csvに拡張子を変更 File newFile = new File("/Users/mono/tmp/" + FileName + ".csv"); try{ if(newFile.createNewFile()){ System.out.println(FileName + "のファイルの作成に成功"); }else{ System.out.println("ファイルの作成に失敗"); } }catch(IOException e){ System.out.println(e); } BufferedWriter bw = new BufferedWriter(new FileWriter(newFile)); // csvファイルにファイル書き込みをする宣言 // ここでbwが始まっている String enter = System.getProperty("line.separator"); // 環境に依存しない改行コードの定義 if (args.length != 0){ //引数必ず1つであること File dir = new File(args[0]); //設定からフォルダを引数として受け取る File[] fileList = dir.listFiles(); //フォルダの中身を配列として格納 if(fileList != null){ //もしフォルダの中身が終わってないなら for(int i = 0; i < fileList.length; i++){ // 繰り返し try{ if (fileList[i].getName().contains(".html")){//もし htmlを含むファイル名があるならば if(checkBeforewritefile(newFile)){ // もしcsvファイルに書き込みをするならば bw.write(fileList[i].getName()); bw.write(" "); //フォルダから取得したhtmlを含むファイル名をcsvファイルに書き込み System.out.println(fileList[i].getName() + "のファイル名を書き込みました"); BufferedReader br = new BufferedReader(new FileReader(fileList[i])); // ファイルを読み込む準備 String line; // String型を定義 String regex = "<title>.*?</title>"; // これを取得したいと定義 Pattern p = Pattern.compile(regex); // 定義した物をパターンと定義 boolean flg = true; // trueをflgに代入 while((line = br.readLine()) != null){ // 行がなくなるまで1行ずつ処理していく if (check(p,line)){ // もしlineにパターンがヒットするなら bw.write(line + enter); //そのlineを書き込みと改行 flg = false; // falseをflgに代入 break; } } if(flg){ // もしflgを処理するなら falseなら breakしないなら bw.write("タイトル無し" + enter); // タイトル無しを記述し改行 } } }else{ System.out.println("書き込めませんでした"); } }catch(IOException e){ System.out.println(e); }finally{ } } } }bw.close(); } private static boolean checkBeforewritefile(File newFile) { if(newFile.exists()){ if(newFile.isFile() && newFile.canWrite()){ return true; } } return false; } private static boolean check(Pattern p, String line) { Matcher m = p.matcher(line); if (m.find()){ return true; }else{ return false; } } }

試したこと

以前よりご質問させていただいておりまして、ご回答いただいた方のコードを試し、また参考にさせていただいております。
また正規表現について調べながら進めておりますが、中々明確な回答というのがいまだに見つからない状態でございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/02/26 01:30

> <title></title>の書き込みを無くしたい 以前の質問の私の回答を再度確認してください。正規表現で()で指定して抽出する方法です。 https://teratail.com/questions/323987#reply-449522 それがまだ良く分からなければ、自力で文字列処理して<title></title>を除去すればよいです。
dodox86

2021/02/26 01:45

> 中々明確な回答というのがいまだに見つからない状態でございます。 まぁ、以前の回答をして明確でないための本質問投稿なのであれば、引き続き回答をお待ちください。
Pro01x19

2021/02/26 01:51

dodox86、いつもありがとうございます。 そちら試してみたのですがマッチするものがないと処理されてしまいました。 しかし、文字列から<title></title>を除去するはreplaceを使った力技で解決が出来ました。 置換しか方法が分からなかったのですが、除去する方法はあったりするのでしょうか?
dodox86

2021/02/26 03:44

結果的に見た目で除去されたかたちであれば良いという意味で「除去」という言葉を使いました。replaceで空文字列に変換することで「除去」でもいいです。 > そちら試してみたのですがマッチするものがないと処理されてしまいました。 うまく適用されていないのではないかと思います。私の既回答ではサンプルのHTMLファイルで実行例を示していますよね。本質問におけるmomon-gaさんの回答もご覧ください。
guest

回答1

0

  1. 必要最小限のコードを作ってテストできるようにしましょう
  2. dodox86さんの既回答をきちんと読みましょう

java

1public static void main(String[] args) { 2 String regex = "<title>(.*?)</title>"; 3 4 Pattern p = Pattern.compile(regex); 5 String line = "<title>ここを抜き出す</title>"; 6 Matcher m = p.matcher(line); 7 8 if (m.find()){ 9 // バッファ 取得したタイトル で書き込み 10 //System.out.println(line); // そりゃ、line を出力すれば、そうなるでしょ 11 System.out.println(m.group(1)); 12 }else{ 13 // バッファ タイトルなし で書き込み 14 System.out.println("no match"); 15 } 16}

投稿2021/02/26 01:46

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/02/26 01:52

> 1. 必要最小限のコードを作ってテストできるようにしましょう これをしない方の何と多いことか。 (私の既回答はさておき、高評価させていただきました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問