[英]string.split() strange behavior. string.split('.') returning single value with comma separated digits?
[英]Regex comma separated single digits ordered ascending
我正在尝试编写一个正则表达式来验证具有以下条件的用户输入(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 必须后跟逗号,如果它们是唯一输入的数字,则不正确。
您可以使用\\b
来确保您位于单词的边界,使用,*
可以使用逗号或不使用逗号。 这导致工作 - 尽管很长
^((1)?(\b,?2)?(\b,?3)?(\b,?4)?(\b,?5)?(\b,?6)?)$
(这是一个愚蠢的答案)
鉴于有六个值,每个值都可以存在或不存在,因此有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)$
请不要实际使用它。 你会让我们看起来都很糟糕。
非正则表达式版本。 简单而精确
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;
}
严格出于学习目的,将问题分解为多个部分。
它必须由一个数字后跟零个或多个逗号加数字组成。
^\d(?:,\d)*$
只有 6 位数字,它们必须按升序排列。 所以只需列出它们和它们之间的逗号; 每一个都是可选的。
^1?,?2?,?3?,?4?,?5?,?6?$
难点在于上述两个正则表达式必须同时匹配。 我们可以对其中之一使用零宽度前瞻。 这将进行匹配但不会“消耗”任何字符。 因此,在匹配之后,正则表达式的下一部分将在与前瞻相同的位置开始。 向前看是通过在(?=
和 ')' 中包装一个表达式来实现的。 给予:
(?=^\d(?:,\d)*$)
结合这两个正则表达式给出以下内容:
(?=^\d(?:,\d)*$)^1?,?2?,?3?,?4?,?5?,?6?$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.