• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:外部ファイルに書いた正規表現を読み込んでマッチさせたい)

外部ファイルに書いた正規表現を読み込んでマッチさせたい

このQ&Aのポイント
  • Javaの初心者が外部ファイルに書いた正規表現を使用してHTMLファイルから文字列を抜き出し、txtファイルに保存したい。
  • 正規表現を直接書くとエラーが出る問題があり、その解決方法を知りたい。
  • zip形式のフォルダを解凍せずに処理する方法を教えてほしい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

補足有難うございます。 私が考えたのは、以下のようにパターンを16個用意すれば再利用できるのではないかな、ということでして。Try~Catchブロックの中だけ、以下に示します。 try { Pattern _d[16]; for (int i=0; i<=15; i++) { _d[i] = Pattern.compile(regexp_list[i]); } BufferedReader input = new BufferedReader(new FileReader("C:\\xxx\\abc_123.html")); BufferedWriter output = new BufferedWriter(new FileWriter("C:\\xxx\\123.txt")); String one_line; while ((one_line = input.readLine()) != null) { for (int i=0; i<regexp_list.length; i++) { //------------// // Pattern _d = Pattern.compile(regexp_list[i]); // Matcher result_file = _d.matcher(one_line); //-----------// Matcher result_file = _d[i].matcher(one_line); if (result_file.find()) { String regexp_data = result_file.group(1); System.out.print(regexp_data); output.write(regexp_data +"\t"); } } } input.close(); output.close(); } catch (IOException e) { System.err.println(e); System.exit(1); }

n-h-11
質問者

お礼

ご教示いただき有難うございます。 配列を宣言するとき、型名にPatternを指定可能なことに気付いておりませんでした。 もっと初歩的な部分を勉強し直した方が良さそうですね。 上に示していただいたソースをそのまま貼り付けると「Patternを解決できません」と出ましたので、 「Pattern[16] _d」を「Pattern[] _d = new Pattern[regexp_list.length];」と書き換えることで、 動作はそのままに実行時間の短縮が出来ました。 質問の 1. は解決しましたし、 2. に取り掛かるには私の習熟具合ではまだ早いように感じますので、一度質問を締め切ります。 プログラミング歴5日の私ですが、osu_neko09さんのお陰でプログラムを書く楽しみの一片を味わえた気がします。 ここまでお付き合い下さり本当に有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

以下の内容を補足いただけませんか? ・regexp_listの中身はなんでしょうか?「^<title>No\\.([0-9]+)</title>$」というような文字列が読み込まれているのでしょうか? ・38行目付近、「Pattern.compile(_i);」を「Pattern.compile(regexp_list[i]);」に書き換えてもエラーになりますか? ・40行目付近、「String regexp_data = result_file.replaceAll("$1");」を「String regexp_data = result_file.group(1);」に書き換えるとどうなりますか? ・やりたい処理は、読み込みファイルの各行から、No、名前、(中略)コメントを抜き出して、タブ区切りでファイルに出力することでしょうか? でしたらパターンのコンパイルを、ループの外に追い出すほうが、処理が速くなると思いますが。

n-h-11
質問者

補足

・regexp_listの中身はなんでしょうか? お察しの通り、regexp.propertiesの値が一行目から順に読み込まれていました。 ・38行目付近、「Pattern.compile(_i);」を「Pattern.compile(regexp_list[i]);」に書き換えてもエラーになりますか? エラーは解消し、regexp_listに格納した正規表現による検索とファイルへの書き出しに成功しました。 ・40行目付近、「String regexp_data = result_file.replaceAll("$1");」を~ 書き換え前後で出力された結果は変わりませんでした。 この場合、マッチした文字列を抜き出したいだけで、書き換える訳ではないので、replaceAllの使用は不適切ということですね。 ・やりたい処理は、読み込みファイルの各行から、No、名前、(中略)コメントを抜き出して、タブ区切りでファイルに出力することでしょうか? ひとつのHTMLファイルから抜き出した複数個のデータをタブ区切りで整形し一行にまとめ、data.txtへ出力したいと言うことでした。 また、HTMLファイルはマッチさせる必要の無い行が大半を占めています。言葉足らずの説明で失礼しました。 ソース内で指定したひとつのファイル(abc_123.html)に対して思う通りの処理を行えるようになったら、 for文なりlistFiles()なりを使ってフォルダ内の全ファイルに処理を掛けるようソースを書き換えるつもりです。 >でしたらパターンのコンパイルを、ループの外に追い出すほうが、処理が速くなると思いますが。 たしかに、今のままだとファイル数が増えるほど・マッチさせたい正規表現が増えるほど、無駄が多くなりますね。 tryの外かwhileの外に出すと解釈し2時間ほど試行錯誤しましたが、どのように書けばエラーを出さずに済むかが分かりませんでした。 ご指摘頂いた箇所を手直ししたことで、ひとまずは満足の行く結果が得られました。有難うございます。 もし宜しければ、パターンのコンパイルに関してのヒントも頂けると助かります。 質問時に上げたものに上記の修正点を書き換えたソースコード http://uploadr.net/file/4179241ad2

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [JAVA]エラーが解決できません。

    JAVAのエラーが解決できません。 ?,[,],(,)をreplaceAllを用いて置換したいと下記のようなプログラムを書いたのですが正常に動作しません。 また、Unicodeに置き換えても見たのですが、うまく動作しませんでした。 そして、排出されたエラーは下記の通りです。 文中にある、?などの記号を置換したいのですが何か良い方法は無いでしょうか? 何卒、ご教授、宜しくお願い致します。 テストコード>>> class Test { public static void main(String args[]) { System.out.println(args[0].replaceAll("?", "置換?")); System.out.println(args[0].replaceAll("[", "置換[")); System.out.println(args[0].replaceAll("(", "置換(")); } } エラー>>> Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0 ? ^ at java.util.regex.Pattern.error(Unknown Source) at java.util.regex.Pattern.sequence(Unknown Source) at java.util.regex.Pattern.expr(Unknown Source) at java.util.regex.Pattern.compile(Unknown Source) at java.util.regex.Pattern.<init>(Unknown Source) at java.util.regex.Pattern.compile(Unknown Source) at java.lang.String.replaceAll(Unknown Source) at Test.main(Test.java:9)

    • ベストアンサー
    • Java
  • Java正規表現-"ある文字列"を含まない文字列

    Javaの正規表現で、HTMLタグ以外の文字列を抽出しようとしています。 HTMLタグはの正規表現は"(</?.*>)"のように表しました。これの否定をしたいのですが、方法を教えて下さい。HTMLタグ以外にヒットさせたいです。 一応、現段階のソースを載せます。 import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HTMLInnerGetter { public static void main(String[] args){ String regex = "(</?.*>)"; String target = "<html><head><title>title</title></head><body><h1>head1<br><p>pragraph</p></body></html>"; ArrayList<String> innerHTMLs = new ArrayList<String>(); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(target); while(matcher.find()){ innerHTMLs.add(matcher.group(1)); } System.out.println(innerHTMLs); } } 出力結果 [<html><head><title>title</title></head><body><h1>head1<br><p>pragraph</p></body></html>] ※否定できなかったので、HTMLタグがヒットしています。

    • ベストアンサー
    • Java
  • Javaでのエラーについて

    Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '.' at java.util.Formatter.checkText(Unknown Source) at java.util.Formatter.parse(Unknown Source) at java.util.Formatter.format(Unknown Source) at java.io.PrintStream.format(Unknown Source) at java.io.PrintStream.printf(Unknown Source) at ShininginSpace.main(ShininginSpace.java:33) と出てきたのですが、これはどういう意味ですか?

    • ベストアンサー
    • Java
  • 正規表現

    Java 5.1 java.util.regex.Pattern java.util.regex.Matcher を用いてHTMLのTABLEを抽出したいのですが、ヒットしません。正規表現のパターンはどうしたらいいのでしょう? パターン: < *table.*?>[\s.]*?< */table *?> 検索対象: … <table border=1 width=200> <tr><th>AA</th><th>BB</th></tr> <tr><td>CC</td><td>DD</td></tr> <tr><td>EE</td><td>FF</td></tr> </table> … で、TABLEタグを含むTABLE全体を期待したのですが全くヒットしませんでした。 ちなみに * <table …>と</table>単体ではヒットします。 * ソースから改行文字を取り除いて一行テキストとした場合にはヒットします。 これらのことから、改行文字がマッチしていないことが原因かと思うのですが、パターンの正規表現についてご教授願います。

    • ベストアンサー
    • Java
  • javaで正規表現ができません

    import java.util.regex;がよみこめません。 なので正規表現ができないみたいなのですが どうしたらうまくいくかおしえてください。 ちなみにjavaのバージョンは多分1.4.0だと思われます。。

    • ベストアンサー
    • Java
  • 正規表現を使った小数入力チェック方法について

    Javaのjava.util.regex.Matcherクラスと java.util.regex.Patternクラスを使用して正規表現を使った 数値の入力チェックを行いたいと思っています。 行いたいチェックは下記の通りです。 【内容】 整数5桁以内で入力 小数部は1桁、ただし小数部は任意入力 例: 1234 => OK 12345 => OK 123456 => NG 12345. => NG 12345.1 => OK 12345.12 => NG 色々考えてみましたが 小数部が任意入力の事もあり、 うまく実現できずに困っています。 このような場合どのような正規表現を組めば良いでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • コンパイルできません

    JAVAを勉強して3日です。 インストール・環境設定を行いましたが、コマンドでコンパイルできません。 すみません、教えてください。 コマンドプロンプトからファイルのあるフォルダへ移動し、javac HelloWorld.java を実行しました。 エラー内容は以下のとおりです。 java.lang.NullPointerException at java.util.Hashtable.put(Compiled Code) at java.util.zip.ZipFile.readCEN(Compiled Code) at java.util.zip.ZipFile.<init>(ZipFile.java:61) at java.util.zip.ZipFile.<init>(ZipFile.java:71) at sun.tools.java.ClassPath.<init>(Compiled Code) at sun.tools.javac.Main.compile(Compiled Code) at sun.tools.javac.Main.main(Main.java:465) 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaアプリケーションでのエラー対処方法

    javaアプリケーションで次のようなエラーが出ます。 どのように対処すればよろしいでしょうか? 入れなければならないソフト等もあればご教示ください。 よろしくお願いいたします。 Exception in thread "main" java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/locks/Lock at UpdateFileCreator.main(Unknown Source) Caused by: java.lang.ClassNotFoundException: edu.emory.mathcs.backport.java.util.concurrent.locks.Lock at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more

  • Modloaderの導入に失敗したのですが・・・

    はじめまして ぼくは昨年、Minecraft 1.2.1でModloaderとその他のMODを使っていたのですが、 なぜかバージョン1.2.5で同じ手順でMOD導入したところ、 このようなErrorが発生してしまいました。 Mods loaded: 1 ModLoader 1.2.5 Minecraft has crashed! ---------------------- Minecraft has stopped running because it encountered a problem. --- BEGIN ERROR REPORT 9f578458 -------- Generated 12/04/11 20:59 Minecraft: Minecraft 1.2.5 OS: Windows 7 (amd64) version 6.1 Java: 1.6.0_31, Sun Microsystems Inc. VM: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Sun Microsystems Inc. LWJGL: 2.4.2 OpenGL: Intel(R) Graphics Media Accelerator HD version 2.1.0 - Build 8.15.10.2057, Intel java.util.zip.ZipException: invalid entry size (expected 1625948168 but got 782 bytes) at java.util.zip.ZipInputStream.readEnd(Unknown Source) at java.util.zip.ZipInputStream.read(Unknown Source) at java.util.zip.ZipInputStream.closeEntry(Unknown Source) at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) at ModLoader.readFromClassPath(ModLoader.java:1204) at ModLoader.init(ModLoader.java:886) at ModLoader.addAllRenderers(ModLoader.java:189) at ahu.<init>(ahu.java:77) at ahu.<clinit>(ahu.java:8) at net.minecraft.client.Minecraft.a(SourceFile:273) at net.minecraft.client.Minecraft.run(SourceFile:657) at java.lang.Thread.run(Unknown Source) --- END ERROR REPORT 6de07c9f ---------- ついでに手順では、 META-INFの削除、minecraft.jarにModloaderの中身すべてをコピーしました。 そして起動する際にはどちらのファイルも開いている状態ではありませんでした。 バージョンもあっていると思います・・・前のバージョンのMODも何回もリセットしたので 入っていません。 ちなみにエラーが出たのはMOJANGが表示された後、5~6秒たってから この画面が出てしまいました。 PCの問題か、あるいはjavaのバージョンかDirectXとかが関係しているのでしょうか? それとも自分のミスでしょうか? 分かる方がおりましたら回答よろしくお願いします。

  • 「javaに関して」エラーが解決できません。java.io.IOException: Bad file descriptor

    インターネットを通して、たくさんのファイルを保存した場合、下記のようなエラーが出ます。 何か、解決手段はないでしょうか? ネットや本をいろいろ見たのですがまったくわかりませんでした。わかる方、ぜひとも、よろしくお願いいたします。 また、こういったエラーが出た場合、自分の力で解く方法を教えていただければ幸いです。 ーーーーエラーーーーーー java.io.IOException: Bad file descriptor at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(Unknown Source) at sun.nio.cs.StreamDecoder$ConverterSD.implRead(Unknown Source) at sun.nio.cs.StreamDecoder.read(Unknown Source) at java.io.InputStreamReader.read(Unknown Source) at java.io.BufferedReader.fill(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at java.io.BufferedReader.readLine(Unknown Source) at test.main(test.java:14) Exception in thread "main"

    • ベストアンサー
    • Java