Ruby 求助正则表达式

jiffies · 2012年05月30日 · 最后由 jiffies 回复于 2012年05月30日 · 2592 次阅读

/<a.*?href="(.*?)".*?>Download\s*Video<\/a\s*>/m 我想匹配这样一段:

<a href="http://xxx.com/aaa" class="orange-button left_20">Download Project Files</a>
<a href="http://xxx.com/bbb">Download Video</a>

我是这样理解的: 1.<a开头 2.匹配任何字符直到第一个 href=" 3.捕获任何字符直到第一个" 4.匹配任何字符直到第一个> (这里多匹配了不知道为什么) 5.Download\s*Video 我觉得会匹配到http://xxx.com/bbb,但实际是http://xxx.com/aaa 请问哪里出了问题?

如果你用/<a.*?href="(.*?)"(.*?)>Download\s*Video<\/a\s*>/m来实验的话会发现第二个括号里面的.*?一直匹配到

class="orange-button left_20">Download Project Files</a>
<a href="http://xxx.com/bbb"

这是因为"这个字符属于.里面,所以不会在遇到href="后的第一个"停下,而是继续匹配下去

解决方法 1)/<a.*?href="([^"]+?)"[^"]*?>Download\s*Video<\/a\s*>/m 2)直接把m去掉,因为在多行模式下.是匹配换行符的

ps: 其实我觉得吧,不就是想得到下载地址么,直接用nokogiri这个 gem 分析页面就好了

# html是通过nokogiri得到的页面对象
html.css("a").each do |dom|
  puts dom.attr['herf'] if dom.text == 'Download Video'
end

@ywjno /<a href="([^"]+?)"([^>]*?)>Download\s*Video<\/a\s*>/m能得到正确结果,的确是对.的理解不对 谢谢,我去试试 nokogiri

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册