正则表达式逗号分隔单个数字按升序排序

时间:2016-05-13 10:24:12

标签: c# regex csv digit

我正在尝试编写一个正则表达式来验证用户输入(asp.net,c#),它具有以下条件:

- single digits within a range of 1 - 6
- comma separated, but list should not begin or end with a comma
- digits cannot be repeated
- digits should be in ascending order

例如:

- 1,2,3,4,5,6   - valid
- 2,5,6         - valid
- 4             - valid
- 2,5,6,        - invalid
- 3,6,5         - invalid
- 2,2,5,6       - invalid

到目前为止,我已经:

^((1,)?(2,)?(3,)?(4,)?(5,)?(6)?)$

这个问题是数字1-5后面必须跟一个逗号,如果它们是输入的唯一数字,则不正确。

4 个答案:

答案 0 :(得分:2)

您可以使用\b确保您位于单词的边界,,*可以使用逗号或不使用逗号。这导致了工作 - 尽管很长

^((1)?(\b,?2)?(\b,?3)?(\b,?4)?(\b,?5)?(\b,?6)?)$

答案 1 :(得分:0)

(这是一个愚蠢的回答)

鉴于有六个值,每个值可以存在或不存在,有2^6 = 64个可能正确的值;除了我猜我们想要排除根本没有数字存在的可能性,因此只有63个可能正确的值。这个正则表达式只允许他们:

^(6|5|5,6|4|4,6|4,5|4,5,6|3|3,6|3,5|3,5,6|3,4|3,4,6|3,4,5|3,4,5,6|2|2,6|2,5|2,5,6|2,4|2,4,6|2,4,5|2,4,5,6|2,3|2,3,6|2,3,5|2,3,5,6|2,3,4|2,3,4,6|2,3,4,5|2,3,4,5,6|1|1,6|1,5|1,5,6|1,4|1,4,6|1,4,5|1,4,5,6|1,3|1,3,6|1,3,5|1,3,5,6|1,3,4|1,3,4,6|1,3,4,5|1,3,4,5,6|1,2|1,2,6|1,2,5|1,2,5,6|1,2,4|1,2,4,6|1,2,4,5|1,2,4,5,6|1,2,3|1,2,3,6|1,2,3,5|1,2,3,5,6|1,2,3,4|1,2,3,4,6|1,2,3,4,5|1,2,3,4,5,6)$

请不要实际使用它。你会让我们看起来都很糟糕。

答案 2 :(得分:0)

非正则表达版。简单而精确

string str = ",1,  2,3, 4, 5, 6";
bool valid = false;
var invalidString = str.Split(',').Any(p =>
{
    int num = 0;
    return int.TryParse(p, out num);
});
if (!invalidString)
{
    List<int> list = str.Split(',').Select(p => int.Parse(p)).ToList();
    var sorted = list.SequenceEqual(list.OrderBy(p => p));
    var hasDuplicates = list.Count != list.Distinct().Count();
    valid = sorted && !hasDuplicates;
}

答案 3 :(得分:0)

严格用于学习目的,将问题分解成碎片。

必须形成一个数字后跟零或多个逗号加数字。

^\d(?:,\d)*$

只有6位数字,它们必须按升序排列。所以只需列出他们和他们介入的逗号;每个都是可选的。

^1?,?2?,?3?,?4?,?5?,?6?$

难点在于上述两个正则表达式必须同时匹配。我们可以在其中一个上使用零宽度前瞻。这将进行匹配,但不会“消耗”任何字符。因此,在匹配之后,正则表达式的下一部分将从与前方相同的位置开始。通过在(?=和')'中包装表达式来实现前瞻。给出:

(?=^\d(?:,\d)*$)

组合两个正则表达式给出以下内容:

(?=^\d(?:,\d)*$)^1?,?2?,?3?,?4?,?5?,?6?$