C# 用于匹配.net中重复数目的值的正则表达式

C# 用于匹配.net中重复数目的值的正则表达式,c#,.net,regex,C#,.net,Regex,给定一个数字范围,比如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有效 我应该将正

给定一个数字范围,比如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有效


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

正则表达式是一种文本处理工具,用于匹配正则语言中的模式。它在语义上非常弱。它无法识别给定字符串中的含义。就像在给定条件下一样,遵循
1Regex是一个文本处理工具,用于匹配正则语言中的模式。它在语义上非常弱。它无法识别给定字符串中的含义。就像在给定条件下一样,为了符合
1的要求,使用Linq进行验证更合适

var isValid = input.Split(",")
                   .GroupBy(s => s)
                   .Select(g => new { Num = int.Parse(g.Key), Count = g.Count() })
                   .All(e => e.Count == 1 && e.Num > 0 && e.Num < 31);
var isValid=input.Split(“,”)
.GroupBy(s=>s)
.Select(g=>new{Num=int.Parse(g.Key),Count=g.Count()})
.All(e=>e.Count==1&&e.Num>0&&e.Num<31);
或者最好创建自己的自定义函数

static bool IsValid(string input)
{
        var strings = input.Split(",");
        if (strings.Any(n => int.Parse(n) <= 0 || int.Parse(n) >= 31)) return false;      
        return new HashSet<string>(strings).Count == strings.Length;
}
静态bool有效(字符串输入)
{
var strings=input.Split(“,”);
if(strings.Any(n=>int.Parse(n)=31))返回false;
返回新的HashSet(strings).Count==strings.Length;
}

使用Linq进行验证更合适

var isValid = input.Split(",")
                   .GroupBy(s => s)
                   .Select(g => new { Num = int.Parse(g.Key), Count = g.Count() })
                   .All(e => e.Count == 1 && e.Num > 0 && e.Num < 31);
var isValid=input.Split(“,”)
.GroupBy(s=>s)
.Select(g=>new{Num=int.Parse(g.Key),Count=g.Count()})
.All(e=>e.Count==1&&e.Num>0&&e.Num<31);
或者最好创建自己的自定义函数

static bool IsValid(string input)
{
        var strings = input.Split(",");
        if (strings.Any(n => int.Parse(n) <= 0 || int.Parse(n) >= 31)) return false;      
        return new HashSet<string>(strings).Count == strings.Length;
}
静态bool有效(字符串输入)
{
var strings=input.Split(“,”);
if(strings.Any(n=>int.Parse(n)=31))返回false;
返回新的HashSet(strings).Count==strings.Length;
}

此作业不需要正则表达式 你可以试试这个

List<int> inputs = new List<int>();
//make sure the number in range
if(input > 0 && input < 31){
  //if there's another input would be added into list so make sure not equal the previous one
  if(inputs.count() > 0){
    if(input != inputs.Any()){
       inputs.Add(input);
     }
   }
 else{
  inputs.Add(input)
 }
列表输入=新列表();
//确保数字在范围内
如果(输入>0&&输入<31){
//如果有另一个输入将被添加到列表中,请确保不等于前一个输入
if(inputs.count()>0){
if(input!=inputs.Any()){
输入。添加(输入);
}
}
否则{
输入。添加(输入)
}

很抱歉,它没有测试过代码,但可以帮助您完成此作业,您不需要正则表达式 你可以试试这个

List<int> inputs = new List<int>();
//make sure the number in range
if(input > 0 && input < 31){
  //if there's another input would be added into list so make sure not equal the previous one
  if(inputs.count() > 0){
    if(input != inputs.Any()){
       inputs.Add(input);
     }
   }
 else{
  inputs.Add(input)
 }
列表输入=新列表();
//确保数字在范围内
如果(输入>0&&输入<31){
//如果有另一个输入将被添加到列表中,请确保不等于前一个输入
if(inputs.count()>0){
if(input!=inputs.Any()){
输入。添加(输入);
}
}
否则{
输入。添加(输入)
}

很抱歉,它没有测试过代码,但可以帮助您执行此操作,而无需正则表达式,但作为对您的问题的回答,您的正则表达式
[1-3][1-1]
匹配11或21或31,因此您可以匹配重复模式,例如311121,11

如果要使用正则表达式执行此操作,可以使用模式
(?:[1-9]|[12]\d |[30)
匹配数字1-30,然后在逗号前重复该模式0多次

如果该格式匹配,请使用split并检查项目数是否等于不同版本

例如:

string pattern = @"^(?:[1-9]|[12]\d|30)(?:,(?:[1-9]|[12]\d|30))*$";
var input = "1,12,30";
List<String> a = input.Split(',').ToList();         
Console.WriteLine(Regex.Match(input, pattern).Success && a.Count == a.Distinct().Count()); // True
string模式=@“^(?[1-9]|[12]\d|30)(?:,(?:[1-9]|[12]\d|30))*$”;
var input=“1,12,30”;
列表a=input.Split(',').ToList();
Console.WriteLine(Regex.Match(输入,模式).Success&&a.Count==a.Distinct().Count());//True

请参阅

您可以在不使用正则表达式的情况下执行此操作,但作为对您的问题的回答,您的正则表达式
[1-3][1-1]
匹配11或21或31,因此您可以匹配重复模式,例如311121,11

如果要使用正则表达式执行此操作,可以使用模式
(?:[1-9]|[12]\d |[30)
匹配数字1-30,然后在逗号前重复该模式0多次

如果该格式匹配,请使用split并检查项目数是否等于不同版本

例如:

string pattern = @"^(?:[1-9]|[12]\d|30)(?:,(?:[1-9]|[12]\d|30))*$";
var input = "1,12,30";
List<String> a = input.Split(',').ToList();         
Console.WriteLine(Regex.Match(input, pattern).Success && a.Count == a.Distinct().Count()); // True
string模式=@“^(?[1-9]|[12]\d|30)(?:,(?:[1-9]|[12]\d|30))*$”;
var input=“1,12,30”;
列表a=input.Split(',').ToList();
Console.WriteLine(Regex.Match(输入,模式).Success&&a.Count==a.Distinct().Count());//True

请参阅|

regex不是执行此任务的最佳工具。您可以使用
input.Split(',').All(x=>Int32.Parse(x)>0&&Int32.Parse(x)<31)
在1和30之间没有重复,所以每个数字只重复一次?你会说
30,29,28
即使顺序不正确也是有效的吗?并且
1,1,10
是无效的,因为有重复的
1
实例。正则表达式不是执行此任务的最佳工具。你可以使用
input.Split(“,”).All(x=>Int32.Parse(x)>0&&Int32.Parse(x)<31)
在1和30之间不重复,所以每个数字只重复一次?您会说
30,29,28
即使顺序不正确也有效吗?
1,1,10
会无效,因为有重复的
1
实例吗?