対象言語: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でなくても良いです。
【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...
【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)
ご回答ありがとうございます。
参考にさせていただきます。
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}
ご回答ありがとうございます。
参考にさせていただきます。
ご回答ありがとうございます。
「*?」により疑問は解決しました。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)