2

htmlタグ間のアイテムをキャプチャするためにRuby正規表現を作成することになっている割り当てを完了しようとしていますが、本当に行き詰まっています。私はどこでも検索しましたが、これまで正規表現しか学習していないため、HTMLパーサーやその他のプログラムの使用に関するアドバイスしか見つかりません。

テキストの例は次のとおりです。

<span id="animal_display">
    <a href="/b/bird">Bird</a>     
    <a href="/c/cat">Cat</a>
    <a href="/c/dog">Dog</a>
</span>

キャプチャしようとしていますBird Cat Dog

この正規表現を使用して、最初の出現を取得できます。

 /<span id="animal_display">.*?<[^>]+>(.*?)<\/[^>]+>.*<\/span>/m

これで3つすべてを取得できますが、3つを超えるアイテムが含まれる可能性のあるリストで正規表現を使用できるようにしたいと思います。

 /<span id="animal_display">\s*<[^>]+>\s*(.*?)<\/a>.\s*<[^>]+>\s*(.*?)<\/a>.\s*<[^>]+>\s*(.*?)<\/a>.<\/span>/

不特定の数のアイテムで機能する可能性のある、より一般化された正規表現はありますか?アドバイスをいただければ幸いです。

4

4 に答える 4

1

便利なdomパーサーを使えば、あなたの生活が楽になると思います。

https://www.ruby-toolbox.com/categories/html_parsing.html

RubyToolboxサイトをチェックすることをお勧めします。

ノコギリがHTMLパーサーの最上位の推奨事項であることに気付くでしょうが、hpricotをチェックする必要があります。とても良いです。「コア」ルビーではありませんが、一般的に使用される宝石です。

于 2012-11-27T02:46:02.773 に答える
1

これは完全な答えではありませんが、他の方向から問題に取り組むことで、毛むくじゃらのキャプチャ正規表現を簡略化できる場合がありますsplit

html  = '...'
r     = / <a[^>]*>\s* | <\/a>[^<]+ /mx
parts = html.split(r)

parts.each { |p| puts p.inspect }

# Output
"<span id=\"animal_display\">                "
"Bird"
""
"Cat"
""
"Dog"
"</span>"
于 2012-11-27T03:01:28.330 に答える
0

これを試してみてください

str.gsub(/ </?[^>] *> /、 "")

于 2012-11-27T02:46:27.700 に答える
0

実生活では、これを解析するためにNokogiriを使用しますが、現在のコースでは、間違った方法を教えることになっているようです。そのため、パーサーを使用せずに結果を取得する方法を次に示します。

まず:

x = '<span id="animal_display">
         <a href="/b/bird">Bird</a>     
         <a href="/c/cat">Cat</a>
         <a href="/c/dog">Dog</a>
     </span>'

それで:

x.scan(/<a.*?>(.*?)<\/a>/).flatten
 => ["Bird", "Cat", "Dog"]

任意の数のリストアイテムに一致して正しい結果を返す正規表現を作成する方法があるかどうかはわかりません。部分式呼び出しを使用することは可能かもしれませんが、それは非常に複雑です。

于 2012-11-27T03:02:09.283 に答える