^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{8,}$
这个正则表达式是说输入的字符串长度必须大于等于8,并且必须包含数字和字母
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b ,^ ,$ 那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言 。最好还是拿例子来说明吧:
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp) 也叫零宽度正预测先行断言 ,它断言自身出现的位置的后面能匹配表达式exp 。比如\b\w+(?=ing\b) ,匹配以ing结尾的单词的前面部分(除了ing以外的部分) ,如查找I'm singing while you're dancing. 时,它会匹配sing 和danc 。
\b\w+(?=ing\b) 跟 \b\w+ing\b 匹配的原来文本中的内容是一样的, 但取匹配到的结果时 \b\w+(?=ing\b) 只取前面部分" \b\w+" ,所以叫零宽断言. (?=exp)这一块没了,取出的长度为0
(?=exp) 匹配的是exp前面的那个位置,特别要注意的是它匹配的只是一个位置,而不是任何字符。比如,\b\w+(?=ing\b)在查找I'm singing while you're dancing的时候会匹配sing和danc,因为其中的 (?=ing)匹配了singing的sing和ing之间的那个位置,还有dancing的danc和ing之间的位置,即ing之前的那个位置。
(?<=exp) 也叫零宽度正回顾后发断言 ,它断言自身出现的位置的前面能匹配表达式exp 。比如(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分) ,例如在查找reading a book 时,它匹配ading 。
(?<=exp) 跟 (?=exp) 差不多,它是在前面
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b ,用它对1234567890 进行查找时结果是234567890 。
用的时候是 (?<=exp)放前面 (?=exp)放后面
下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s) 匹配以空白符间隔的数字(再次强调,不包括这些空白符) 。
java 正则 <=断言的限制, 需要有最大值,不能用+ 和 * . (?<=abc)rems\w{1,65535}?可以, (?<=abc)rems\w*? 不可以
perl中 <=断言中不能用数量词 (*,+之类的)
http://deerchao.net/tutorials/regex/regex.htm#negativelookaround