【正则】正向预查

     今天碰到一个问题

密码正则表达式要求必含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前面那么匹配到的字符串中有数字就好了,不用知道数字所在位置。

 

 

另外要提到的是环视的顺序是可以打乱的,因为他们的交集并没有改变。

比如上面的也可以写成


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值