正则表达式逗号分隔列表


75

验证像这样的逗号分隔列表的正则表达式是什么:

12365, 45236, 458, 1, 99996332, ......

会不会有逃脱的角色,例如:12365,45236,"This is a \"test."
ceejayoz

7
为什么必须是正则表达式?根据语言的不同,使用内置的CSV解析器可能会更好。
Mark Biek 09年

Answers:


112

我建议您通过以下方式进行操作:

(\d+)(,\s*\d+)*

这将适用于包含1个或多个元素的列表。


1
没错,我必须先删除第一个字符,然后才能使用正则表达式,感谢大家的帮助
everLearningStudent

@ondrobaco:您可能只检查第一个比赛组。下一个匹配组将包含列表的其余部分。
Asaph

4
上述解决方案不会验证空列表。(^$)|(^(\d+)(,\s*\d+)*$)也许可以。
克里斯,

1
@Val:您的解决方案存在的问题是,它将不匹配根本没有逗号的列表,例如"1""12345"。这些列表不包含多个项目,因此没有逗号。您的正则表达式(\d+,)*要求每个数字后面都必须有一个逗号。
Asaph

4
如何匹配/提取每个元素(使用正则表达式)?
古斯塔沃·彪马2014年

19

此正则表达式从逗号分隔的列表中提取元素,而与内容无关:

(.+?)(?:,|$)

如果仅用其他内容替换逗号,则它应适用于任何定界符。


它提取多个元素吗?
paranza

1
为了在逗号后处理空格,例如在OP中,我建议进行以下修改: (.+?)(?:,\s*|$)
Chad Cloman

1
@paranza-是的,它将提取多个元素,但是仅在启用全局匹配的情况下,您使用的任何函数都会返回所有匹配项,而不仅仅是第一个。在过去,您可以通过在斜杠后面加一个“ g”(例如/expr/g)来实现此目的,但是显然这还不是全部标准。例如,在PHP中,您必须使用preg_match_all()而不是preg_match()。正则表达式的其他形式也有其他方式。
乍得克洛曼

10

这取决于您的确切要求。我假设:所有数字,任何长度,数字都不能有前导零,也不能包含逗号或小数点。单个数字始终以逗号分隔,后跟一个空格,最后一个数字后面没有逗号和空格。这些错误中的任何一个都会简化解决方案。

([1-9] [0-9] *,[])* [1-9] [0-9] *

这是我在思想上的构建方式:

[0-9]  any digit.
[1-9][0-9]*  leading non-zero digit followed by any number of digits
[1-9][0-9]*, as above, followed by a comma
[1-9][0-9]*[ ]  as above, followed by a space
([1-9][0-9]*[ ])*  as above, repeated 0 or more times
([1-9][0-9]*[ ])*[1-9][0-9]*  as above, with a final number that doesn't have a comma.

我发现这个答案真的很有用,只需要稍微调整一下即可在逗号前后接受空格([1-9][0-9]*[ ]*,[ ]*)*[1-9][0-9]*...也许有人会觉得这个有用
pollirrata 2012年

我最喜欢这个示例,此后如何允许换行?
justinpees

7

匹配重复的逗号分隔项目:

(?<=,|^)([^,]*)(,\1)+(?=,|$)

参考

该正则表达式可用于拆分逗号定界列表的值。列表元素可以带引号,不带引号或为空。一对引号内的逗号不匹配。

,(?!(?<=(?:^|,)\s*"(?:[^"]|""|\\")*,)(?:[^"]|""|\\")*"\s*(?:,|$))

参考


管道符号(|)到底在做什么?这是您链接到的页面中未解释的一个符号,我无法理解。
Thomas Vander Stichele 2013年

@ThomasVanderStichele:是为了交替。(foo|bar)匹配foobar。有关更多信息:regular-expressions.info/alternation.html
阿马尔·穆拉利


5

如果这对您很重要,则它将在行的开头或结尾拒绝多余的逗号。

((, )?(^)?(possible|value|patterns))*

possible|value|patterns与您允许的值匹配的正则表达式替换。


2

我将其用于必须为字母数字的项目列表,每个项目的前面均不带下划线。

^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$

1

为了安全起见,您可能想指定语言,但是

(\d+, ?)+(\d+)?

应该工作


1
对于仅包含1个元素的列表,此解决方案将失败。请参阅下面的我的解决方案。
Asaph

1

我有一个稍微不同的要求,就是要使用转义的逗号来解析编码的字典/哈希表,如下所示:

"1=This is something, 2=This is something,,with an escaped comma, 3=This is something else"

我认为这是一个优雅的解决方案,并且可以避免很多正则表达式的复杂性:

if (string.IsNullOrEmpty(encodedValues))
{
    return null;
}
else
{
    var retVal = new Dictionary<int, string>();
    var reFields = new Regex(@"([0-9]+)\=(([A-Za-z0-9\s]|(,,))+),");
    foreach (Match match in reFields.Matches(encodedValues + ","))
    {
        var id = match.Groups[1].Value;
        var value = match.Groups[2].Value;
        retVal[int.Parse(id)] = value.Replace(",,", ",");
    }
    return retVal;
}

我认为可以使用@"([0-9]+),\s?"和解析表达式来适应原始问题Groups[0]

我希望它对某人有帮助,并感谢您提供接近它的提示,尤其是Asaph!


1

在JavaScript中,可split用于帮助并捕获任何负数:

'-1,2,-3'.match(/(-?\d+)(,\s*-?\d+)*/)[0].split(',');
// ["-1", "2", "-3"]
// may need trimming if digits are space-separated

0

以下内容将匹配任何以逗号分隔的单词/数字/空格组合

(((.)*,)*)(.)*

当您要用逗号分隔值时,该正则表达式没有用。它允许单词;word; word ...
caravana_942
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.