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="blahblah"和url在htmlUrl="http://blahblahblah"的url

这是我解决这个问题的尝试

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

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

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

既然您提到您无法访问gems(您应该解决这个问题:),这里有一些使用标准库中的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

最新更新