Regex检查编号在列表中是唯一的

本文关键字:唯一 列表 检查 编号 Regex | 更新日期: 2023-09-27 18:25:20

我正试图找到一种方法来检查输入字符串是否是唯一的数字。例如:

1,2,45,4,5 => true
11,13,14,15 => true
12,123,12,15 => false
3,5,67,3,5,3 => false

我不得不学习并编写代码('d+)(,|'d| )*('1)进行测试,但它在相同的一位数中失败,失败案例为:

23,13,14 
1,11,15

Regex检查编号在列表中是唯一的

假设您对非正则表达式解决方案持开放态度,检测重复项的一种方法是在逗号上拆分,按数字分组,并查看是否有任何数字重复。

var input = "12,123,12,15";
var isUnique = input.Split(',')
                    .GroupBy(x => x)
                    .All(x => x.Count() == 1);  // returns false in this case

类似的东西?(无正则表达式)

public static bool func(string s){
    try {
        return s.Split(',')
        .Select(x=>Int32.Parse(x))
        .GroupBy(x=>x)
        .All(x=>x.Count() == 1)
    }catch (FormatException e){
        //oh noes the string was not formatted nicely :(
        return false; // do something appropriate for your application
    }
}

我认为你应该检查数字的末尾(comas)

Regex r = new Regex(@"(^|,)('d+),(.*,)?'2($|,)");

编辑

我制作了一个更神秘的正则表达式版本。它处理前导零和空格。

Regex r = new Regex(@"(^|[,'s])0*('d+)[,'s](.*[,'s])?0*'2($|[,'s])");
string[] samples = new string[]{
    "1,2,45,4,5",
    "11,13,14,15",
    "12,123,12,15",
    "3,5,67,3,5,3",
    "23,13,14",
    "1,11,15",
    "3,003",
    "1,3,4,3"
};
foreach (string sample in samples)
{
    Console.WriteLine(sample + " => " + (r.IsMatch(sample) ? "duplicit" : "unique"));
}

输出

1,2,45,4,5 => unique
11,13,14,15 => unique
12,123,12,15 => duplicit
3,5,67,3,5,3 => duplicit
23,13,14 => unique
1,11,15 => unique
3,003 => duplicit
1,3,4,3 => duplicit