用于检查号码的正则表达式在列表中是唯一的

时间:2015-12-02 02:49:16

标签: c# regex

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

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

3 个答案:

答案 0 :(得分:4)

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

var input = "12,123,12,15";

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

答案 1 :(得分:1)

这样的东西? (没有正则表达式)

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
    }
}

答案 2 :(得分:0)

我认为你应该检查数字的结束位置(昏迷状态)

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