2010-03-14 188 views
1

我知道一點正則表達式,但不會發生變化。從以下html中獲取數字的最佳方法是什麼? (我想有32個返回)。在這個可怕的html頁面中,寬度,行跨度和大小的值都是不同的。任何幫助?紅寶石正則表達式幫助

<td width=14 rowspan=2 align=right><font size=2 face="helvetica">32</font></td> 
+0

最好的方法是使用解析器而不是正則表達式。 :-) – Erik 2010-03-14 01:52:30

+0

@Erik:原則上是的,但對於快速和骯髒的屏幕掃描正則表達式通常是一個可行的工具。 – Joey 2010-03-14 01:55:11

+0

我會使用解析器,但HTML格式太差。 – bunnyBEARZ 2010-03-14 02:02:26

回答

2

如何

>(\d+)< 

或者,如果你拼命想要避免使用捕獲組都:

(?<=>)\d+(?=<) 
+0

這將返回> 32 <但我想我可以只是做string.match(/>(\ d +) bunnyBEARZ 2010-03-14 01:57:07

+0

@bun:那麼,你會發現'32'第一個捕獲小組......我編輯了答案,包括一個不需要該小組的例子。 – Joey 2010-03-14 01:59:23

+0

太棒了,非常感謝。 – bunnyBEARZ 2010-03-14 02:05:23

0

可能

<td[^>]*><font[^>]*>\d+</font></td> 
+0

這肯定會匹配上面的字符串,但不會做任何事情來提取'32'。 – Joey 2010-03-14 02:00:48

+0

那麼,如果Ruby的regexp synatx是從Perl借用的,那麼你需要把\ d +放在圓括號中。然後使用match()[1] – Arkadiy 2010-03-14 02:34:27

2

請,自己動手做贊成:

#!/usr/bin/env ruby 
require 'nokogiri' 

require 'test/unit' 
class TestExtraction < Test::Unit::TestCase 
    def test_that_it_extracts_the_number_correctly 
    doc = Nokogiri::HTML('<td width=14 rowspan=2 align=right><font size=2 face="helvetica">32</font></td>') 
    assert_equal [32], (doc/'//td/font').map {|el| el.text.to_i } 
    end 
end 
+0

我同意。與使用解析器相比,使用正則表達式處理HTML內容比長期更容易出錯。 – 2010-03-14 07:31:13