1

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

富,酒吧,巴兹:某事

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

我已经尝试过了,它应该可以工作,但由于某种原因没有填充所有匹配组:

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

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

有任何想法吗?

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

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

EDIT3:在末尾添加冒号,因为我不只是想匹配列表。抱歉,问题过于简单化了。

4

4 回答 4

4

这个表达对我有用:/(\w+)/i

于 2012-04-28T21:21:46.610 回答
1

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

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

这匹配逗号分隔的字段,包括逗号出现在带引号的字符串中的可能性,例如123,"Yes, No". 正则表达式为此。

更详细地说:

(?<=^|,)       # 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's 的东西re.findall(),它返回字符串中所有不重叠的匹配项(如果重要的话,从左到右工作。)不要将它与你的等价物一起使用,re.search()或者re.match()只返回找到的第一个匹配项。

(注意:这实际上在 Python 中不起作用,因为后视(?<=^|,)不是固定宽度。Grr。欢迎对此提出建议。)


编辑:使用非捕获组来使用行首或逗号,而不是向后看,它在 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 的Ruby 等价物re.findall(needle, haystack)haystack.scan(needle).

于 2012-04-28T21:34:26.103 回答
0

对于这种情况,也许split会是更好的解决方案?

'foo,bar,baz'.split(',')
=> ["foo", "bar", "baz"]
于 2012-04-28T21:20:44.833 回答
0

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

合适的正则表达式是:

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

这应该找到您正在寻找的一切。

于 2018-06-28T15:40:39.413 回答