这个正则表达式怎么样
^(?!.*,$|.*\d{2,})(?:([\d*#]),?(?!.*\1))+$
对于以逗号分隔的每个值,我将其捕获到 group1 中,然后使用\1
(backreference)检查它是否发生在前面
^
标记字符串的开始
(?!.*,$|.*\d{2,})
是一个前瞻,仅当字符串不以两个或多个数字结尾或有两个或多个数字时才会进一步匹配,
在(?:([\d*#]),?(?!.*\1))+
单个[\d*#]
被捕获,group 1
然后我们使用 . 检查字符串中是否有任何出现(?!.*\1)
。\1
指第 1 组中的值。对每个这样的值重复此过程,使用+
$
标记字符串的结尾
例如
输入
1,2,4,6,2
(?!.*,$|.*\d{2,})
检查字符串是否不以,
或有两个或多个数字结尾
上面的前瞻只检查模式但不匹配任何东西。所以我们仍然在字符串的开头
([\d*#])
1
在第 1 组中捕获
(?!.*\1)
检查(不匹配)前面的1
任何地方。因为我们没有找到,我们继续前进
由于+
我们会再次做同样的事情
([\d*#])
现在将2
在第 1 组中捕获
(?!.*\1)
检查(不匹配)前面的2
任何地方。因为我们找到它,我们匹配文本失败
在这里工作
但是你最好使用非正则表达式解决方案,因为它会更简单和可维护..
var str="1,2,4,6,6";
str=str.replace(/,/g,"");//replace all , with empty string
var valid=true;
for(var i=0;i<str.length-1;i++)
{
var temp=str.substr(i+1);
if(temp.indexOf(str[i])!=-1)valid=false;
}
//valid is true or false depending on input