将逗号分隔列表与Ruby Regex匹配

时间:2012-04-28 21:15:48

标签: ruby regex oniguruma

给定以下字符串,我想在冒号后匹配列表的元素和其余部分:

  

FOO,酒吧,巴兹:东西

即。我期待前三个比赛组成为“foo”,“bar”,“baz”。没有逗号,也没有冒号。元素的最小数量是1,并且可以任意多个。假设没有空格和小写。

我已经尝试了这个,这应该可行,但由于某种原因不会填充所有匹配组:

^([a-z]+)(?:,([a-z]+))*:(something)

匹配\ 1中的foo和\ 2中的baz(或最后一个元素)。我不明白为什么我没有得到一个匹配组吧。

有什么想法吗?

编辑:Ruby 1.9.3,如果重要的话。

EDIT2:Rubular链接:http://rubular.com/r/pDhByoarbA

EDIT3:在结尾添加冒号,因为我不只是尝试匹配列表。对不起,过分简化了问题。

4 个答案:

答案 0 :(得分:3)

此表达式适用于我:/(\w+)/i

答案 1 :(得分:1)

如果你想用正则表达式做,那怎么样?

(?<=^|,)("[^"]*"|[^,]*)(?=,|$)

这匹配以逗号分隔的字段,包括逗号出现在123,"Yes, No"等引用字符串中的可能性。 Regexr for this.

更详细地说:

(?<=^|,)       # Must be preceded by start-of-line or comma
(
    "[^"]*"|   # A quote, followed by a bunch of non-quotes, followed by quote, OR
    [^,]*      # OR anything until the next comma
)
(?=,|$)        # Must end with comma or end-of-line

使用类似于Python re.findall()的东西,它返回字符串中所有非重叠的匹配(如果重要的话,从左到右工作。)不要将它与等效的{{1一起使用}}或re.search()仅返回找到的第一个匹配项。

(注意:这实际上在Python中不起作用,因为lookbehind re.match()不是固定宽度.Grr。打开对此的建议。)


编辑:使用非捕获组来使用行尾或逗号,而不是使用lookbehind,它可以在Python中使用。

(?<=^|,)

编辑2:Python >>> test_str = '123,456,"String","String, with, commas","Zero-width fields next",,"",nyet,123' >>> m = re.findall('(?:^|,)("[^"]*"|[^,]*)(?=,|$)',test_str) >>> m ['123', '456', '"String"', '"String, with, commas"', '"Zero-width fields next"', '', '""', 'nyet', '123'] 的{​​{3}}为re.findall(needle, haystack)

答案 2 :(得分:0)

对于这种情况,也许split会更好地解决这个问题吗?

'foo,bar,baz'.split(',')
=> ["foo", "bar", "baz"]

答案 3 :(得分:0)

如果我正确地解释了您的帖子,那么您希望在逗号(:)之前用逗号分隔所有内容。

适合的正则表达式为:

[^\s:]*(,[^\s:]*)*(:.*)?

这应该找到您想要的一切。