今天碰到一个问题
密码正则表达式要求必含1个数字,1个字母,1个特殊字符,长度不少于n
有个人给出了答案 :
首先是要明白(?=...)的作用。与^和$类似,(?=...)匹配的是满足某条件的一个位置,而并不占据实际字符。
^:字符串开始的位置。
$:字符串结束的位置。
(?=...):字串中含有...的位置。不要仅仅理解成 匹配...前面的位置。
如何理解像(?=x)y这样的表达式呢?此处x与y可以理解为不同的子正则表达式。此时,x与y是指的同一位置,该位置可以同时满足x与y的正则条件。
举例说明:
(?=2)/d 表示该处是数字2(已经明确界定),而且还必须是一位数字。
它与(?=2)/w,或(?=2).都是等价的。因为(?=2)是个较窄的界定,它包含于/d或/w或万能的.之内。
因此,(?=...)用在前面时,作用是与后面的正则式一起,其正则式的交集来限定所匹配的内容。
看完这个解释,再回头看/^(?=.*/d)(?=.*[a-zA-Z])(?=.*[/W/_])/S{n,}/就明白了,(?=.*/d)(?=.*[a-zA-Z])(?=.*[/W/_])/S就是取数字,字母,特殊字符的交集。其中.*写在/d前面那么匹配到的字符串中有数字就好了,不用知道数字所在位置。
另外要提到的是环视的顺序是可以打乱的,因为他们的交集并没有改变。
比如上面的也可以写成