【发布时间】:2010-11-26 15:13:56
【问题描述】:
验证逗号分隔列表的正则表达式是什么:
12365, 45236, 458, 1, 99996332, ......
【问题讨论】:
-
是否会有转义字符,例如:
12365,45236,"This is a \"test." -
为什么必须是正则表达式?根据语言的不同,您最好使用内置的 CSV 解析器。
验证逗号分隔列表的正则表达式是什么:
12365, 45236, 458, 1, 99996332, ......
【问题讨论】:
12365,45236,"This is a \"test."
以下将匹配任何逗号分隔的单词/数字/空格组合
(((.)*,)*)(.)*
【讨论】:
我建议你这样做:
(\d+)(,\s*\d+)*
这适用于包含 1 个或多个元素的列表。
【讨论】:
(^$)|(^(\d+)(,\s*\d+)*$) 可能会起作用。
"1" 或"12345"。这些列表不包含多个项目,因此它们没有逗号。而您的正则表达式(\d+,)* 要求每个数字后跟一个逗号。
在 JavaScript 中,使用 split 来帮忙,并捕获任何负数:
'-1,2,-3'.match(/(-?\d+)(,\s*-?\d+)*/)[0].split(',');
// ["-1", "2", "-3"]
// may need trimming if digits are space-separated
【讨论】:
此正则表达式从逗号分隔列表中提取一个元素,而不考虑内容:
(.+?)(?:,|$)
如果你只是用其他东西替换逗号,它应该适用于任何分隔符。
【讨论】:
(.+?)(?:,\s*|$)
/expr/g),但显然它并不是那么标准。例如,在 PHP 中,您必须使用 preg_match_all() 而不是 preg_match()。其他风格的正则表达式有其他方法。
如果这对您很重要,此选项将拒绝行首或行尾多余的逗号。
((, )?(^)?(possible|value|patterns))*
将possible|value|patterns 替换为与您的允许值匹配的正则表达式。
【讨论】:
我有一个稍微不同的要求,用转义逗号解析编码的字典/哈希表,如下所示:
"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!
【讨论】:
我用它来列出每个项目前面必须是字母数字且没有下划线的项目。
^(([0-9a-zA-Z][0-9a-zA-Z_]*)([,][0-9a-zA-Z][0-9a-zA-Z_]*)*)$
【讨论】:
【讨论】:
(foo|bar) 匹配 foo 或 bar。欲了解更多信息:regular-expressions.info/alternation.html
这在一定程度上取决于您的具体要求。我假设:所有数字,任何长度,数字都不能有前导零,也不能包含逗号或小数点。单个数字总是用逗号分隔,然后是空格,最后一个数字后面没有逗号和空格。任何这些错误都会简化解决方案。
([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]* ...也许有人会觉得这很有用
/^\d+(?:, ?\d+)*$/
【讨论】:
为了安全起见,您可能想指定语言,但是
(\d+, ?)+(\d+)?
应该可以工作
【讨论】: