• ベストアンサー

java正規表現で複数行を取得し配列にする

javaの正規表現で、下記のようなテキストファイルから配列を作成しようと思っています。 ---------------- .title1 hoge fuga ..title2 hoge2 fuga2 ---------------- ↓ Array[0] = ".title1 hoge fuga" Array[1] = "..title2 hoge2 fuga2" このようなテキストファイルで、上に示したように行頭が[ . ]の行から、次の行頭が[ . ]の行の直前の行までを配列の一つの要素としたいのですが、どのようにすればいいでしょうか ^\.[\w|\W]+ この表現では、「.title1」からテキストの最後までが一致してしまいます。かといって、 ^\.[\w|\W]+^\. としてしまうと、こんどは「.title2」から始まる部分の取得ができなくなってしまいます。 なにかいい方法はありませんでしょうか。正規表現以外でも構いません。よろしくお願い致します

  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

あれ、もしかして「..title2」って誤記でしょうか 「.title2」が正しいのであれば、こうですね http://ideone.com/ty6sh http://ideone.com/c1kZS ※さっき自分が書いたのにも誤記がありました。  「'..'から始まる行の処理後」→「'..'から始まる行の処理前」

bornless
質問者

お礼

回答ありがとうございました。 「..title2」は正しい表記です。 行頭ドットの数は1-6個の場合があり、そのすべてに一致する必要がありました。 最終的に正規表現で取得する方法を発見しまして、以下のような感じで取得できました。 ^\..*?(?=(^\.|\Z)) これを利用してwhileループで配列作ろうと思ってたのですが、行頭1-6個のドットに一致する正規表現つくってsplit使ったほうが処理楽そうですね…… 直接的な解ではありませんでしたが、正規表現一致後の処理について参考になりました。ありがとうございました!

その他の回答 (2)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

少し勉強したっきりとまっているため、自分にはJava自体のコードで示す事が出来ませんでした。 テキスト処理手法の方へコメントを残しますので、Javaへ応用出来そうであれば使ってみてください。 記載された例を拝見する限り、'.'から始まるという事を気にしなくて良いと思います。 '..'だけ意識すればそれほど難しい話ではなく、例えば次のように解けそうです。 <1> 1, 一度に全て、文字列として読み込む 2, 行頭に「..」がくる箇所で文字列を分割(正規表現利用) Ruby: http://ideone.com/vCISB <2> ※mutableな文字列の場合なので、Javaだとちょっと変わりそうです。 1, 一行ずつ読み込み、文字列へ加えていく 2, '..'から始まる行の処理後、対象文字列を差し替える(startsWithを使えば、正規表現不要) Ruby: http://ideone.com/oIcOz

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

1行ずつ読み込んで処理しちゃダメ?

bornless
質問者

お礼

一行ずつだと処理が重くなるんじゃないかと思いまして……

関連するQ&A

  • ruby 配列の中の正規表現は比較に使える?

    数万行あるテキストファイルの中を数百パターンくらいの正規表現で サーチするRubyスクリプトを作成しようとしていますがうまくできません。 どなたかお知恵を拝借させてください。 以下の流れで作ろうとしています。 「 ファイルを一行GETして、その行が事前に定義した配列内の正規表現に合致していればprintする。 次の行をGETして、最初からた正規表現の配列を比較して、合致していればprintする。 テキストファイルが終わるまで、繰り返し 」 何分初心者なもので…、他のやり方があれば教えていただきたいです… ヨロシクお願いしますm(__)m

    • ベストアンサー
    • Ruby
  • 正規表現について

    下記期待する結果通りになる正規表現を考えておりますが、 うまくいきません。教えて下さい。 期待する結果 hoge(fuga sumomo) マッチする hoge(foo(sumomo)) アンマッチする sumomoが()で囲われている hoge(bar()sumomo) マッチする 作成した正規表現 hoge\([^(]*sumomo[^)]*\) 実際の結果 hoge(fuga sumomo) マッチ hoge(foo(sumomo)) アンマッチ hoge(bar()sumomo) アンマッチ ←予想と違う

  • 正規表現の「^」と「$」がうまくいかない

    正規表現の「^」と「$」を使うとうまく働いてくれません。 あるデータの中の、行頭がhttpで始まる1行を取り出したいです。 あるデータ$dataを preg_match_all("/^http(.*?)$/",$data,$result); print_r($result); で出力すると、 ■結果 Array ( [0] => Array ( ) [1] => Array ( ) ) となり、うまくいきません。 preg_match_all("/http(.*?)\n/",$data,$result); やけでこんな感じにやったら、行頭から始まるhttp.....も行頭からはじまらないものもゲットしてすべて出力してくれてしまいます。 行頭から始まるものだけを出力するにはどうしたらいいでしょうか。 php5 UTF-8環境

    • ベストアンサー
    • PHP
  • 正規表現を教えて下さい。

    正規表現を教えて下さい。 1行目の各拡張子を(赤)、2行目の行頭のsakuraを(青)、それ以外を(黄)に色分けする正規表現を教えて頂けないでしょうか。 [.txt;.ini;.cfg; sakura|"D:\Program Files\sakura\sakura.exe" "%P" ] サクラエディタ ver.1.6.50

  • 行頭に「> 」がある行、すべてを指定する正規表現

    行頭に「> 」(半角「>」のあとに半角スペースが入っています)がある行、すべてを指定する正規表現を教えてください。 aaaaa > aaaa bbbb > bbbb このような文章だと、 > aaaa と > bbbb を指定する正規表現ということです。 お願いします。

  • 正規表現でのマッチング

    連想配列%hushがあります。 %hushの中のキーが「a何とか」、つまり a0、a1、a2、a3、・・・ の値だけを、配列@arrayに格納します。 つまり  $array[0]=$hush{'a0'}  $array[1]=$hush{'a1'}  $array[2]=$hush{'a2'}  $array[3]=$hush{'a3'} ・・・ といった感じにしたいのですが、 「a何とか」は正規表現を用いて  a.* と表現できます。 ってここまでは手元の本で分かったのですが、マッチングのif文をどう書けばいいんだよ!  if($key==a.*) と書いてもうまくマッチしてくれないんで、a.*を""で括ってみたり()で括ってみたりするものの相手にされず・・・ 手元の本は「こういう場合正規表現ではこう書けば良くて、これをマッチングさせれば良い」みたいなことを書いていますが、マッチングのさせ方は書いていません。 プログラムの文法書を読むと、条件分岐の仕方は書いていますが、==演算子の右側が正規表現だった場合の使い方は書いていません。 あるいは、正規表現の場合のマッチングはif文などを用いないのでしょうか? だったら正規表現の本にマッチングの文法を書いていますよね!? なんだかんだでマッチングがうまくいかないのです。 この場合、どう記述すればいいのでしょうか? お手数をお掛けします。

  • Linuxの正規表現について

    Linuxの正規表現について教えてください。 正規表現を使うと、文字列のパターンを表す事ができる。例えば、行頭が「#」で始まる行は____、aもしくはfで始まる三文字の文字列は____となる という問題なんですけど____の部分をだれか教えてください。明日テストなんだけどわからくて… お願いします。

  • HTMLからimgのsrcのみを正規表現で抽出する

    Webサイトから画像だけをダウンロードするツールをJavaの勉強がてら作成しており、HTML内に含まれた全てのimgタグのsrc部分のみを抽出したいと考えています。 現在、正規表現を使ってHTMLからimgタグのsrcを抽出し、srcの一覧を取得するようなメソッドを作成していますが、私の実力が及ばないばかりに上手く出来ずに困っております。 以下のようなHTMLが有った場合の例を挙げます。 <html> <body> <img src="hoge.jpeg"> <img src="./hoge.jpeg"> <img src="./fuga/hoge.jpeg"> <img src="../fuga/hoge.jpeg"> <img src="http://fuga/hoge.jpeg"> </body> </html> 上記のHTMLがString型に格納されてますので、 作成した抽出用メソッドの引数に渡すと以下のようなString[]型の文字列を返す想定をしています。 [0]=hoge.jpeg [1]=./hoge.jpeg [2]=./fuga/hoge.jpeg [3]=../fuga/hoge.jpeg [4]=http://fuga/hoge.jpeg しかしながら現在、以下のような結果となり、最後の1件しか取得できていない状況です。 [0]=http://fuga/hoge.jpeg 恐らく正規表現が正しくないせいだとは思いますが、どのようにすれば取得できるのか分からず困っています。 もしこの問題についての解決策をご存じの方がおりましたら、ご教示いただけましたら幸いです。 よろしくお願いします 以下、作成中のテストソースです。 //---------------------------------------------------- import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { String testHtml = "<html><body><img src=\"hoge.jpeg\"><img src=\"./hoge.jpeg\"><img src=\"./fuga/hoge.jpeg\"><img src=\"../fuga/hoge.jpeg\"><img src=\"http://fuga/hoge.jpeg\"></body></html>"; String[] res = extractImgSrc(testHtml); // 結果表示 for (int i = 0; i < res.length; i++) { System.out.println("res[" + i + "]=" + res[i]); } } // imgタグのsrcからurlを抽出 public static String[] extractImgSrc(String html) { List<String> result = new ArrayList<String>(); Pattern p = Pattern.compile("<\\s*img.*src\\s*=\\s*([\\\"'])?([^ \\\"']*)[^>]*>"); Matcher m = p.matcher(html); while (m.find()) { result.add(m.group(2)); } return result.toArray(new String[result.size()]); } }

    • ベストアンサー
    • Java
  • 正規表現について

    たくさんあるhtmlファイル内に特定の条件に該当するファイルを探したい場合の正規表現で、 <title>から</title>の間に「.jpg」や「%」といった特定の文字列を含んだ行を検索したいのですが、どのように書いたら良いでしょうか? お手数ですが、よろしくお願い致します。

  • ruby 正規表現

    こんばんは。 Rubyでの正規表現での質問なのですが、 例えば"hoge"という文字が含まれる行全体にマッチさせるような正規表現は存在するのでしょうか? また存在する場合はどのように記述すれば良いのでしょうか。 単純な質問で申し訳ありませんが、よろしくお願いいたします。

専門家に質問してみよう