需求如下,有一字符串str,写正则表达式,必须满足如下条件:
1,不能为空字符串
2,必须是整数
3,不能以0开头
4,0-9中每个数字,只能出现一次。即0-9这十个数每个数只能出现一次,1265是可以的,1125667就不行了,1出现了2次,6也出现了两次

//下面这两种表达式异曲同工:
var
exp2=/^(?!0)(?:([0-9])(?!.*?\1))+$/;
var exp3=/^(?=[1-9])(?:([0-9])(?!.*?\1))+$/;
首先这两个表达式都可以简化一下成下面的形式

var
exp2=/^(?!0)(?:([0-9])(?!.*\1))+$/;
var
exp3=/^(?=[1-9])(?:([0-9])(?!.*\1))+$/;
是的,区别只是将?去掉,因为有了*的存在,?是明显的多余。
那么,怎么去理解这个正则表达式呢?
var exp3=/^(?=[1-9])(?:([0-9])(?!.*\1))+$/;
下面为例进行一下浅析
首先,(?=[1-9])是一个“预搜索,不匹配”表达式,也即如果开头的第一个字符不是“0”则开始匹配,但是如果
我们对其进行捕捉的话,将会发现这个字符并不在匹配串中。真正的匹配开始于其后符合条件的字符。
关于正则表达式的语法可以参考这里 。接着,(?:([0-9])(?!.*\1))+
这个表达式包含了多个分组(由多个括号来划分)。第一重括号由(?:...)组成,由于?:的存在,这是个匹配但
不被捕捉的分组。最关键的是([0-9])(?!.*\1)
它表示的匹配是:一个由0到9的整数开头,后面跟着不能出现与这个整数重复的子串。([0-9])很好理解,表
示一个数字,(?!.*\1)这个表达式中包含有多个语法:反向引用\1、贪婪匹配、预搜索不匹配等语法。
首先(?!...)表示如果右边的串不是"..."则匹配其左边的串。对于
([0-9])(?!.*\1)则是如果有个串左边是
数字,则其后也就是右边的子串任何位置中不能出现与之重复的字符。例如,12345、12均符合上面的表达式,
但是1223455、112345都不符合。可在这里进行在线测试。 最后,^和$匹配字符串的开头和结尾,+用来限定串的长度。可以根据需要 使用{m,n}的形式明确限定其长度。