c# - 用于匹配.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 有效
我应该将我的正则表达式更改为什么?
解决方案
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
推荐阅读
- airflow - Airflow Broken DAG 消息 - 额外数据
- flutter - Flutter 中的背景音乐不起作用
- python - Pandas 到日期时间的转换运行缓慢/未运行
- php - 如何比较php输入字段和mysql数据库表
- gnuplot - 无法在 gnuplot 中绘制直线而不显示不同的点类型
- .net - 使用一个插入语句和参数插入多行
- haskell - 如何在没有堆栈的情况下运行抖动
- docker - 如何将 docker 镜像从 docker hub 部署到 ibm 云免费层
- python - 您如何建模多个到达分布?
- reactjs - 无法将 null 发送到 state 以使 ImageField 在 React 和 Django 中更改为 null