如何通过Regex捕获可变长,逗号分隔的字符串列表?

时间:2013-10-08 16:19:27

标签: ruby regex string

我正在使用ruby 2.0及其正则表达式引擎。

给出以下字符串:

str = "one: two, three: four"

列表的长度是可变的(从0到无限)。我如何捕获它的条目?所以在这个例子中正则表达式应该匹配:

[1]:"one: two", [2]:"three: four"

这是我到目前为止所提出的:

/((\w+:\s\w+),?)*/

但它只给了我:

 => #<MatchData "one: two," 1:"one: two," 2:"one: two"> 

我做错了什么?

4 个答案:

答案 0 :(得分:1)

我认为你可以使用这个正则表达式:

/[^,]*/

演示: http://www.rubular.com/r/wB6uWFxgAg

答案 1 :(得分:1)

您不需要正则表达式。使用String#split

str = "one: two, three: four"
str.split(', ') # => ["one: two", "three: four"]

使用正则表达式:

str.split(/, /) # => ["one: two", "three: four"]

str.scan(/[^,]+/) # => ["one: two", " three: four"]
str.scan(/[^,]+/).map &:strip # => ["one: two", "three: four"]

答案 2 :(得分:0)

您不能在尝试时使用*重复捕获括号。它只会捕获最后一场比赛。

正如已经指出的那样,扫描方法是可行的方法。

str.scan(/(\w+:\s\w+),?/)

答案 3 :(得分:0)

它甚至更简单:这可以做你想要的 - 即捕获组1和2中的两个名称:值对:

/(\w+:\s\w+)/

使用您的示例查看此正则表达式的rub live demo