2

我正在尝试完成一项任务,我应该编写一个 Ruby 正则表达式来捕获 html 标签之间的项目,但我真的被卡住了。我到处搜索,但我只能找到关于使用 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

我可以得到这三个,但我希望能够在可能包含三个以上项目的列表上使用正则表达式:

 /<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

我建议查看 Ruby Toolbox 站点。

您会注意到 Nokogiri 是 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 回答