使用Ruby Regex匹配逗号分隔的列表

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

FOO,酒吧,巴兹:东西

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

我试过这个,应该可以工作,但不会因为某种原因填充所有的比赛组:

^([az]+)(?:,([az]+))*:(something)

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

有任何想法吗?

编辑:Ruby 1.9.3,如果这很重要。

编辑2:Rubular链接:http://rubular.com/r/pDhByoarbA

编辑3:添加冒号到最后,因为我不只是试图匹配列表。 对不起,过分简化了这个问题。


这个表达式适用于我: /(w+)/i


也许split会更好的解决这种情况?

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

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

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

这与逗号分隔的字段相匹配,包括逗号出现在引号字符串123,"Yes, No"的可能性123,"Yes, No" 。 Regexr为此。

更详细地说:

(?<=^|,)       # 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()类似,它返回字符串中所有不重叠的匹配项(从左向右工作,如果重要的话)。不要将它用于re.search()re.match()只返回找到的第一个匹配。

(注意:这实际上在Python中不起作用,因为后向(?<=^|,)不是固定的宽度。


编辑:使用非捕获组消耗开始行或逗号,而不是后视,它在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']

编辑2:Python的re.findall(needle, haystack)的Ruby等价物是haystack.scan(needle)

链接地址: http://www.djcxy.com/p/76887.html

上一篇: Match comma separated list with Ruby Regex

下一篇: Parsing HTML using Python