源自这里:http://bbs.csdn.net/topics/390804087
.*?(\d).*?\1.*?$ 这个判断了有重复的数字
原理: ?是非贪婪,从最少的数量试起
*是0~无穷大次。最小就是0
对于源串“1234567890”
第一次: .*? ==> 空
\d ==> 1
.*? ==> 空
\1 ==> 2 但是希望的是前面的捕获组(\d)的内容 ,也就是1,所以,第一次尝试失败。
第二次: 正则从最后面向前回退状态,所以,先重新尝试第二个 .*?
.*? ==> 2
\1 ==> 3 但是希望的是前面的捕获组(\d)的内容 ,也就是1,。。。
第N次尝试,当第二个.*?已经吃进23456789,\1 ==> 0,仍然是失败,已经无法再有尝试了。
开始回退再前面的第一个.*?
.*? ==> 1
\d ==> 2
.*? ==> 空
所以,再次尝试失败。
。。。。第N次尝试,当第一个.*?已经吃进12345678,\d ==> 9 \1 ==> 0,仍然是失败,已经无法再有尝试了。
整个尝试失败,表明字符串是由完全无重复的数字构成的。
$ 是表明到当前位置的时候必须是字符串结束位置,确保所有字符都参加了尝试。第三个.*?基本属于配合它打酱油的。
把.*?换成.*,使用贪婪模式,应该也可以实现同样功能,但是回退过程将完全不同。
第一次尝试第一个.*就吃进了1234567890,然后开始吐字符来回退。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。