如何使用Ruby正则表达式从XML片段中提取值

时间:2010-12-25 20:47:34

标签: ruby regex

我有这个字符串:

"lorem <tt>text1</tt> ipsum <tt>text2</tt>dolor si amet"

我需要将<tt>...</tt>之间的文本提取到数组中,我尝试过:

"lorem <tt>text1</tt> ipsum <tt>text2</tt>dolor si amet".scan(/<tt>(.*)<\/tt>/)

但没有运气......

2 个答案:

答案 0 :(得分:4)

使用解析器要好得多,即使是一个很小的片段,除非你确定字符串永远不会改变格式并且你从端到端拥有这个过程。

那就是说,为了满足你对正则表达式的要求,我会使用String.scan:

str = "lorem <tt>text1</tt> ipsum <tt>text2</tt>dolor si amet"

str.scan(%r{<tt>([^<]+)</tt>}).flatten # => ["text1", "text2"]

只是为了说明使用解析器是多么简单:

require 'nokogiri'
doc = Nokogiri::HTML(str)
doc.css('tt').map(&:text) # => ["text1", "text2"]

好处是灵活性和稳健性。

答案 1 :(得分:2)

尝试.scan(/<tt>(.*?)<\/tt>/)

此处*?是所谓的“不情愿的量词”。

s = "lorem <tt>text1</tt> ipsum <tt>text2</tt>dolor si amet"
puts s.scan(/<tt>(.*?)<\/tt>/).inspect #  => [["text1"], ["text2"]]