2010-03-14 130 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