我正在尝试编写一个正则表达式来验证用户输入(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后面必须跟一个逗号,如果它们是输入的唯一数字,则不正确。
答案 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?$