正则中的预判以及懒惰模式

预判:在正式匹配正则表达式之前,先预读整个字符串,进行初步匹配,如果预判都未通过,则不再验证!

个人理解:另外预判需要正则表达式做引导,相当于在原有的正则表达式上增添条件,没有正则表达式的预判无效

 1)(?=表达式): 先浏览字符串是否满足表达式的要求

      何时使用:只要正则中出现类似"而且"

      比如:4位数字,但不能包含4和7

      (?=[^47]$) 是否由除了4,7之外的字符组成

 2)(?!表达式):先检查字符串是否不满足表达式要求

   比如:6位以上密码。

   字母,数字组成

           首字母不能是数字: [a-zA-Z][a-zA-Z0-9]{5,}

           必须至少包含1个大写字母

           不能都由小写字母和数字组成: (?![a-z0-9]+$)

           必须至少包含1个数字

           不能都由小写字母和大写字母组成:

            (?![a-zA-Z]+$)

    8位密码,开头为字母,其他位为w区间的字符

    (?!d+$)w{8}

非懒惰模式以及懒惰模式:.*? 以及 .*

    8位数,每一位上数字都不一样

    (?!.*?(d).*?(1).*?$)d{8};

    个人理解:由于预判作用是正向否定,负向肯定的意思,那么可以这么理解,从最后面往前面看, 最后一个.*?表示的是在区域范围内查找,即相邻数字之间或者是非相邻数字之间,而第一个.*?表示的是首个数字或者中间的某个数字,与之相邻的.*?(1)表示的是第一个括号里面的内容,即为(d),意思就是与之前相同的数字,而预判是正向否定,即排除范围内相同数字,而区间是d{8},从而获取8位都不相同的数字

正则中容易混淆的地方:

s  指代所有非空字符

w 指代匹配所有单词字符,等价于[0-9a-zA-Z_]

正则匹配中小写和大写匹配的内容相反,比如s和S,w和W

原文地址:https://www.cnblogs.com/laoniaofly/p/5941487.html