Ruby样式正则表达式

时间:2014-05-05 01:37:31

标签: ruby

我过去使用过perl,现在我转向ruby,或者更喜欢在perl旁边学习ruby。

我正在尝试从包含此类数据的xml文件中提取数据

        <outline type="rss" text="w4kfu's bl0g" title="w4kfu's bl0g" xmlUrl="http://blog.w4kfu.com/?feed=rss" htmlUrl="http://blog.w4kfu.com"/>

我试图仅在text =&#34; blahblah&#34;的引号之间提取文本。和htmlUrl中的网址=&#34; http:// blahblahblah&#34;

这是我尝试解决这个问题

ruby -ne 'next if $_ =~ %r[text=\"([^"]*)\"]x and print $1, "\n"' file_name.xml

我知道ruby试图像perl一样强大但同时拥有更整洁的代码。对我来说,这个解决方案似乎有点儿了,我想知道什么是正确的红宝石方式。

1 个答案:

答案 0 :(得分:2)

我建议使用真正的解析器解析XML。它具有更强大的优势。例如,如果另一个元素恰好具有text属性,它将不会误报,并且它将容纳XML中的空格和换行符。

由于您提到您无法访问宝石(您应该使用这个:),这里使用标准库中的REXML。它不像Nokogiri那么干净,但也不算太差。

require 'rexml/document'

doc = REXML::Document.new open("file.xml")
REXML::XPath.each(doc, "//outline") do |element|
  puts element.attributes["title"], element.attributes["htmlUrl"]
end

这里是一个ruby命令行来打印标题:

ruby -r 'rexml/document' -e "doc = REXML::Document.new open('file_name.xml')" 
  -e "puts REXML::XPath.each(doc, '//outline').map{|el| el.attributes['title']}"

#=> w4kfu's bl0g

但我觉得你真的想要一个具有更多红宝石感的正则表达式解决方案。你走了:

ruby -ne 'puts $_.scan(/text=\"([^"]*)\"/)' file_name.xml

#=> w4kfu's bl0g