ruby正则表达式扫描多个匹配

时间:2011-11-25 06:41:21

标签: ruby regex html-parsing

我想在两个标签之间获取文字。

<b> foo</b>bar<br/> =&gt; bar

我尝试使用'<b>asdasd</b>qwe<br/>'.scan(/<b>[a-zA-Z0-9]*<\/b>(.*)<br\/>/),它给了我正确的结果。

但是当我尝试这个时:

'<b>exclude</b>op1<br/>exclude 2<b>exclude</b>op2<br/>exclude 2<b>exclude</b>op3<br/>exclude 2'.scan(/<b>[a-zA-Z0-9]*<\/b>(.*)<br\/>/) { |ele|
puts ele
}

它匹配第一个<b>标记和最后一个<br/>标记,并返回我期望匹配数组的整个字符串

2 个答案:

答案 0 :(得分:9)

而不是在html上使用正则表达式使用nokogiri:

Nokogiri::HTML.fragment(str).css('b').each do |b|
    puts b.next.text
end

答案 1 :(得分:8)

(.*)更改为(.*?)以使其不合适

/<b>[a-zA-Z0-9]*<\/b>(.*?)<br\/>/

测试

[2] pry(main)> '<b>exclude</b>op1<br/>exclude 2<b>exclude</b>op2<br/>exclude 2<b>exclude</b>op3<br/>exclude 2'.scan(/<b>[a-zA-Z0-9]*<\/b>(.*?)<br\/>/) { |ele|
[2] pry(main)*   puts ele
[2] pry(main)* }  
op1
op2
op3