【正規表現の書き方を教えてください】


対象言語:ruby 1.8.7

str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
str.scan(/????????/)
=> ["<tr><td>AAA</td></tr>","<tr><td>BBB</td></tr>","<tr><td>CCC</td></tr>"]

上記のような結果を出す正規表現の書き方を教えていただけますでしょうか?
実現できるのであれば、scanでなくても良いです。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2011/01/20 21:00:52
  • 終了:2011/01/21 02:36:55

ベストアンサー

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492011/01/20 21:27:17

ポイント50pt

【1】サンプル程度のものであれば、いろいろなとり方がありますよ

str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
p str.scan(/<tr><td>.*?<\/td><\/tr>/)
str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
p str.scan(/<tr>.*?<\/tr>/)

【2】もっといろいろな条件も考慮する必要があるのではないでしょうか?

ほんの一例ですが、下記のような場合などは考慮しなくても良いのでしょうか?

「コメント・トラックバックを表示する」にチェックをいれて、もう少し具体的に書いてもらえれば作りますよ

str = "<tr><td>AAA</td></tr><TR id=\"data2\"><td>BBB</td></TR><tr><td>CCC</td></tr>"

http://www.namaraii.com/rubytips/?%A5%D1%A5%BF%A1%BC%A5%F3%A5%DE...

id:f-ikesan

ご回答ありがとうございます。

「*?」により疑問は解決しました。0回以上の繰り返し「最短一致」!便利ですね。

これで以下のような複数階層のものも分割できます。

str = <<"EOF"

<tr class="aaa">

<td><b>1AAA</b></td>

<td><span><a href="#">1BBB</a></td>

<td>1CCC</td>

</tr>

<tr>

<td>2AAA</td>

<td>2BBB</td>

<td><span class="test">2CCC</span></td>

</tr>

EOF

参考にさせていただき作成してみました。

str.scan(/<tr[^>]*>.*?<\/tr>/im)

2011/01/21 02:34:58

その他の回答(2件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492011/01/20 21:27:17ここでベストアンサー

ポイント50pt

【1】サンプル程度のものであれば、いろいろなとり方がありますよ

str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
p str.scan(/<tr><td>.*?<\/td><\/tr>/)
str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
p str.scan(/<tr>.*?<\/tr>/)

【2】もっといろいろな条件も考慮する必要があるのではないでしょうか?

ほんの一例ですが、下記のような場合などは考慮しなくても良いのでしょうか?

「コメント・トラックバックを表示する」にチェックをいれて、もう少し具体的に書いてもらえれば作りますよ

str = "<tr><td>AAA</td></tr><TR id=\"data2\"><td>BBB</td></TR><tr><td>CCC</td></tr>"

http://www.namaraii.com/rubytips/?%A5%D1%A5%BF%A1%BC%A5%F3%A5%DE...

id:f-ikesan

ご回答ありがとうございます。

「*?」により疑問は解決しました。0回以上の繰り返し「最短一致」!便利ですね。

これで以下のような複数階層のものも分割できます。

str = <<"EOF"

<tr class="aaa">

<td><b>1AAA</b></td>

<td><span><a href="#">1BBB</a></td>

<td>1CCC</td>

</tr>

<tr>

<td>2AAA</td>

<td>2BBB</td>

<td><span class="test">2CCC</span></td>

</tr>

EOF

参考にさせていただき作成してみました。

str.scan(/<tr[^>]*>.*?<\/tr>/im)

2011/01/21 02:34:58
id:a-kuma3 No.2

a-kuma3回答回数4506ベストアンサー獲得回数18702011/01/20 21:36:24

ポイント15pt

ちょっと力技だけど。

str.scan(/(<tr><td>[^<]+<\/td><\/tr>)/)

http://dummy/

id:f-ikesan

ご回答ありがとうございます。

参考にさせていただきます。

2011/01/21 02:31:06
id:Cherenkov No.3

Cherenkov回答回数1503ベストアンサー獲得回数4932011/01/20 23:02:37

ポイント15pt
str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
p str.scan(/(<tr><td>[^<>]+<\/td><\/tr>)/).map {|s| s.to_s}

同じことをNokogiriを使ってDOMパースしてcssセレクタやXPathで検索。

require 'rubygems'
require 'nokogiri'

str = "<tr><td>AAA</td></tr><tr><td>BBB</td></tr><tr><td>CCC</td></tr>"
doc = Nokogiri::HTML(str)

p trs = doc.css('tr').map {|e| e.to_s.chomp}

逆引きRuby - 文字列

id:f-ikesan

ご回答ありがとうございます。

参考にさせていただきます。

2011/01/21 02:31:37
  • id:windofjuly
    うぃんど 2011/01/21 03:09:47
    出来たようで何よりです
     
    雑談ですがHTMLタグの取り扱いについて人力検索では2パターンが存在します
    (1)質問文、コメント欄
    タグは自動的にエスケープされたものに変換されます
    行頭の半角スペースなどはHTMLの仕様に基づいて左詰にされてしまったりします
    (2)回答欄、返信欄
    使用許可されていないタグは削除され、使用許可されていない一部タグはそのままで生き残り、閉じ忘れた場合にはサイト全体のデザインを崩してくれたりもします
    そのため回答欄、返信欄にコードを書きたい場合には下記、はてな記法(スーパーpre記法もしくはシンタックス・ハイライト)を用いる必要があります

    人力検索はてなで利用可能なタグ一覧
    http://hatenaquestion.g.hatena.ne.jp/keyword/%e4%ba%ba%e5%8a%9b%e6%a4%9c%e7%b4%a2%e3%81%af%e3%81%a6%e3%81%aa%e3%81%a7%e5%88%a9%e7%94%a8%e5%8f%af%e8%83%bd%e3%81%aa%e3%82%bf%e3%82%b0%e4%b8%80%e8%a6%a7
    人力検索はてなで利用可能なはてな記法一覧
    http://hatenaquestion.g.hatena.ne.jp/keyword/%e4%ba%ba%e5%8a%9b%e6%a4%9c%e7%b4%a2%e3%81%af%e3%81%a6%e3%81%aa%e3%81%a7%e5%88%a9%e7%94%a8%e5%8f%af%e8%83%bd%e3%81%aa%e3%81%af%e3%81%a6%e3%81%aa%e8%a8%98%e6%b3%95%e4%b8%80%e8%a6%a7
  • id:sayo212sayo
    コメント荒らし キタ━━(━(━(-( ( (゚∀゚) ) )-)━)━) ━━ !!!!!
     
    イルカ賞をもらっておきながら質問者に対してお説教
    一体どういう神経をしているのやら

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません