我试图找到一种方法来检查输入字符串是否是唯一的数字。例如:
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
答案 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