首页 > 解决方案 > 用于匹配.net中重复值的正则表达式

问题描述

给定一个数字范围,比如 1-30,允许用户选择任意数量的值,而不会在 1 到 30 之间重复,我正在尝试编写一个正则表达式来找出有效和无效的输入。

var input = "1,12,30";
Regex regex = new Regex("([1-3][1-1],[1-3][1-1])+");
if(regex.IsMatch(input))
{
  Console.WriteLine("Input is in correct format");
}

例如:4,78,6 无效
2,6,24 有效

我应该将我的正则表达式更改为什么?

标签: c#.netregex

解决方案


Regex 是一种文本处理工具,用于匹配常规语言中的模式。在语义方面它非常弱。它无法识别给定字符串中的含义。就像在您给定的条件下一样,要符合1 <= x <= 30条件,您需要了解它们的数值。

所以,你使用了错误的工具。正则表达式在这里帮不了你。或者即使你得到了一个解决方案,那也太复杂了,而且太难扩展了。

更好的方法是把Split字符串放在逗号上,然后比较数字。

var numbers = input
       .Split(',') // split to an enumerable of strings
       .Select(int.Parse) // transform to an enumerable of numbers
       .ToArray(); // Creates an array from a IEnumerable<int>
return numbers.All(x => x > 0 && x <= 30) // range check
       && numbers.Length == numbers.Distinct().Length; // uniqueness check

推荐阅读