是否可以从Ruby regexp数据中排除一些用于匹配的字符串?

时间:2011-09-06 03:23:13

标签: ruby regex

我有一堆字符串,例如,像这样:

<option value="Spain">Spain</option>

我想从内部提取国家名称。

我在Ruby中想到的最简单的方法是使用这种形式的正则表达式:

country  = line.match(/>(.+)</)

然而,这会返回>Spain<。所以我这样做了:

line.match(/>(.+)</).to_s.gsub!(/<|>/,"")

效果很好,但如果没有更优雅的方法,我会感到惊讶吗?似乎使用正则表达式来声明如何找到所需的东西,而实际上并不希望用于匹配它的封闭字符串成为返回数据的一部分。

这个问题有传统方法吗?

1 个答案:

答案 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']