我有一堆字符串,例如,像这样:
<option value="Spain">Spain</option>
我想从内部提取国家名称。
我在Ruby中想到的最简单的方法是使用这种形式的正则表达式:
country = line.match(/>(.+)</)
然而,这会返回>Spain<
。所以我这样做了:
line.match(/>(.+)</).to_s.gsub!(/<|>/,"")
效果很好,但如果没有更优雅的方法,我会感到惊讶吗?似乎使用正则表达式来声明如何找到所需的东西,而实际上并不希望用于匹配它的封闭字符串成为返回数据的一部分。
这个问题有传统方法吗?
答案 0 :(得分:5)
处理该字符串的正确方法是使用HTML解析器,例如:
country = Nokogiri::HTML('<option value="Spain">Spain</option>').at('option').text
如果您有多个此类字符串,请将它们粘贴在一起并使用search
:
html = '<option value="Spain">Spain</option><option value="Canada">Canada</option>'
countries = Nokogiri::HTML(html).search('option').map(&:text)
# ["Spain", "Canada"]
但如果你必须使用正则表达式,那么:
country = '<option value="Spain">Spain</option>'.match('>([^<]+)<')[1]
请注意,match
实际上会返回MatchData个对象和MatchData#to_s
:
返回整个匹配的字符串。
但您可以使用MatchData#[]
访问捕获的群组。如果你不喜欢计数,你也可以使用一个命名的捕获组:
country = '<option value="Spain">Spain</option>'.match('>(?<name>[^<]+)<')['name']