日期:2014-05-20  浏览次数:20833 次

问个蛮灵异的正则表达式问题
我找到一个匹配不重复的N位数字的正则

(?!.*?(.).*?\1)[0-9]{N}

(?!.*?(.).*?\1)[0-9]{7}这个就是匹配10位不重复数字的,"0123456"可以匹配,但是"0113456"就不会匹配,这个没问题,OK

现在我有个要求是这样的,

1<space>XXXX<space>XXXX<space>XXXX<space>XXXX<space>XXXX<space>XXXX<space>XXXX

XXXX为1-10位不重复的数字,那么我将上面的东西整合进来

一开始写成这样的正则

Regex reg=new Regex(@"^1\s(((?!.*?(.).*?\1)[0-9]{1,10})\s){6}(?!.*?(.).*?\1)[0-9]{1,10}$");

发现居然不对?然后我将6位降低到4位,居然对了,能成功的匹配

string x = "1 12 13 13 24 12";

但是当变成5的时候,string x = "1 12 13 13 24 12 15";就不能匹配了。1-4都能匹配,4以上的就匹配不了了,怎么会这样子的?



------解决方案--------------------
貌似酱紫可以:

^1(?:\s(?:(\d)(?![^\s]*\1)){1,10}){7}$
------解决方案--------------------
开始考虑复杂了,楼上的可以简化为

C# code
string x = "1 12 13 13 24 12 15";
Regex reg = new Regex(@"^1(?:\s(?:(\d)(?!\S*\1)){1,10}){6}$"); 
if (reg.IsMatch(x))
{
    richTextBox2.Text += "匹配成功!";
}
else
{
    richTextBox2.Text += "匹配失败!";
}