正则是如何判断有重复/由不重复的数字组成的串的。

源自这里:http://bbs.csdn.net/topics/390804087

.*?(\d).*?\1.*?$ 这个判断了有重复的数字

原理: ?是非贪婪,从最少的数量试起

            *是0~无穷大次。最小就是0

对于源串“1234567890”

第一次: .*? ==> 空

               \d ==> 1  

              .*?  ==> 空

               \1 ==> 2 但是希望的是前面的捕获组(\d)的内容 ,也就是1,所以,第一次尝试失败。

第二次: 正则从最后面向前回退状态,所以,先重新尝试第二个 .*?

               .*? ==> 空

               \d ==> 1  

              .*?  ==>  2

               \1 ==> 3  但是希望的是前面的捕获组(\d)的内容 ,也就是1, 所以,第一次尝试失败。

。。。

第N次尝试,当第二个.*?已经吃进23456789,\1 ==> 0,仍然是失败,已经无法再有尝试了。

开始回退再前面的第一个.*?

               .*? ==> 1

               \d ==> 2  

              .*?  ==>  空

               \1 ==> 3  但是希望的是前面的捕获组(\d)的内容 ,也就是1, 所以,再次尝试失败。

。。。。

第N次尝试,当第一个.*?已经吃进12345678,\d ==> 9  \1 ==> 0,仍然是失败,已经无法再有尝试了。

整个尝试失败,表明字符串是由完全无重复的数字构成的。

             $  是表明到当前位置的时候必须是字符串结束位置,确保所有字符都参加了尝试。第三个.*?基本属于配合它打酱油的。

把.*?换成.*,使用贪婪模式,应该也可以实现同样功能,但是回退过程将完全不同。

第一次尝试第一个.*就吃进了1234567890,然后开始吐字符来回退。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值