我有这个字符串:
"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>/)
但没有运气......
答案 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"]]