【问题标题】:ruby regex scan multiple matchruby 正则表达式扫描多个匹配
【发布时间】:2012-01-06 02:59:39
【问题描述】:

我正在尝试获取两个标签之间的文本。

<b> foo</b>bar<br/> => 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
}

它匹配第一个 &lt;b&gt; 标记和最后一个 &lt;br/&gt; 标记并返回我期望的匹配数组的整个字符串

【问题讨论】:

标签: ruby regex html-parsing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    (.*) 更改为 (.*?) 以使其不贪婪

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

    【讨论】:

    • 您无法使用正则表达式解析 HTML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多