1

我正在使用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

4 回答 4

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"]
于 2013-10-08T16:23:53.373 回答
1

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

/[^,]*/

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

于 2013-10-08T16:20:33.067 回答
0

它甚至比这更简单:这可以满足您的要求 - 即捕获第 1 组和第 2 组中的两个名称:值对:

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

请参阅与您的示例一起使用此正则表达式的 rubular 的现场演示。

于 2013-10-09T01:58:13.093 回答
0

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

正如已经指出的那样,扫描方法是要走的路。

str.scan(/(\w+:\s\w+),?/)
于 2013-10-08T21:30:04.887 回答