人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

対象言語: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でなくても良いです。

●質問者: f-ikesan
●カテゴリ:コンピュータ インターネット
✍キーワード:AAA CCC Ruby 1.8.7 Scan STR
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● うぃんど
●50ポイント ベストアンサー

【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...

◎質問者からの返答

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

「*?」により疑問は解決しました。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)


2 ● a-kuma3
●15ポイント

ちょっと力技だけど。

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

http://dummy/

◎質問者からの返答

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

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


3 ● Cherenkov
●15ポイント
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 - 文字列

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ