正则匹配高级笔记

2019-01-02  本文已影响0人  吉凶以情迁
限定大小写必须包含 只包含两种
^((?=[A-Za-z])[a-zA-Z]+){3,10}$


(^(?=.*?[A-Z])(?=.*?[0-9])[A-Z0-9]*$)的理解


.*?不能删除,比如这里匹配第二个括号的时候无法匹配整个字符串,但是.*?就ok了,就取出了数字
如果删除第一个里面的.*?呢, AA1是没问题的, 1A就不行了,因为在取出第一个的时候无法和整体进行匹配就得到了空,


改成不带?=呢,那么就多出了自匹配文本 1 2 3了。
(^(?=.*?[A-Z])(?=.*?你)[A-Z0-9]*$)测试 大写和数字,发现无法命中,原因是()里面的都要选中的,然后和后面的组合。所以无法成立了

那么如果不包含?=呢,

代表选择 字母A-Z和 后面的任意匹配
或者选择后面的0-0和后面的任意匹配,但是肯查是代表二选一??

三选一

(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]


代表前面的三组任何组合和最后[]中的进行匹配, 那么总共组合有 

(?=.*[A-Z]) (?=.*[a-z]) 与后面的[]任意命中, 


环视主要有以下4个用法: 
(?<=exp) 匹配前面是exp的数据 
(?<!exp) 匹配前面不是exp的数据 
(?=exp) 匹配后面是exp的数据 
(?!exp) 匹配后面不是exp的数据

示例四: 
(?<=B)AAA 匹配前面是B的数据,即BAAA匹配,而CAAA不匹配 
(?<!B)AAA 匹配前面不是B的数据,即CAAA匹配,而BAAA不匹配 
AAA(?=B) 匹配后面是B的数据,即AAAB匹配,而AAAC不匹配 
AAA(?!B) 匹配后面不是B的数据,即AAAC能匹配,而AAAB不能匹配

另外,还会看到(?!B)[A-Z]这种写法,其实它是[A-Z]范围里,排除B的意思,前置的(?!B)只是对后面数据的一个限定,从而达到过滤匹配的效果。
^(?=.*?[A-Z])(?=.*?[a-z])[a-zA-Z]*$
这个表达式表示只允许大小写组合,必须大小写组合才能成立
  
理解1:
[a-zA-Z]* 如果没有 那么写,那么无法通过,为什么呢?
假设输入aB,开始的小写就会被第二个 前瞻(?=)里面的全部匹配上,那么继续往后面走,就会命中[a-zA-Z]里面的A-Z 因为小写已经被吸收了。

假设输入Ba  开始的大写就会被第一个前瞻(?=)里面全部吸收掉,那么走到a的时候也和上面的差不多,是被[a-zA-Z]*匹配上了。
至于最后面填写*为什么也没出错,是因为如果没有匹配那么被前面吸收掉了。


.*? 无法理解,不加上不行。放到()外面的前面就无法过滤其它符号,所以他的含义就是让其它无法通过。
比如Aa可以通过但是aAa就无法通过了,也就是第一个a命中的应该是第二个。

改成 ^(?=[a-z]*[A-Z])(?=[A-Z]*[a-z])[a-zA-Z]*$ 也是可以的。交叉组合,但是.*?给人一种无解,认为可以传递其它,就好比最后面的*$  *完全应该写成+因为*不会成立,只要大写a或者全部小写a就无法通过了。

改造之后变成了

^(?=[a-z]*[A-Z])(?=[A-Z]*[a-z])[a-zA-Z]+$


再解释一次,如果 命中第一个括号,后面的不写aB可以命中的,但是最后面那个不能丢。


aB和 Ba可以直接用
^(?=[a-z]*[A-Z])[a-zA-Z]+$ 但是会导致BBBBB也能直接通过了
用^(?=[A-Z]*[a-z])[a-zA-Z]+$ 也是一样的,能让ABBa 杜能检测,但是纯aa通过了,
所以两个前瞻组合,就能结合为一体,让A a这样纯大写和小写都不能通过。




(^(?=.*[A-Za-z])(?=.*[^A-Za-z0-9])([A-Za-z]
|[^A-Za-z0-9])*$)|(^(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?=.*[0-9])([A-Z0-9]
|[^A-Za-z0-9])*$)
|(^(?=.*[^A-Za-z0-9])(?=.*[a-z])(?=.*[0-9])([a-z0-9]|[^A-Za-z0-9])*$)




     Pattern compile = Pattern.compile("(?<=A|B|C|D)Good");//非获取匹配,前瞻 返回的是左边,也就是window 所以后面的.*非贪婪得到了Zbcdefg而不是bcdefg
        Matcher matcher = compile.matcher("bbbAGood");


    matcher.group()返回的是Good,给?<=再套上1个()group1无法取得数据。




     Pattern compile = Pattern.compile("(Window(?=7|8|9|Z)).*");
        Matcher matcher = compile.matcher("aWindow78");

group1 =Window也就是被口号包括的
group0 整体 ,返回的是Window78


        Pattern compile = Pattern.compile("(Window(?!7|8|9|Z)).*");
        Matcher matcher = compile.matcher("aWindow1");
取反,输入Window7将不匹配 输入aWindow1 后group0 =Window group1: Window1 



        Pattern compile = Pattern.compile("((?<!A|B|C|D))Good");//非获取匹配,前瞻 返回的是左边,也就是window 所以后面的.*非贪婪得到了Zbcdefg而不是bcdefg
        Matcher matcher = compile.matcher("bbbGGood");


group0 =Good group1=空,如果输入 bbAGood将无法匹配,这里是后顾取反。





        Pattern compile = Pattern.compile("((?<!A|B|C|D))Good");//非获取匹配,前瞻 返回的是左边,也就是window 所以后面的.*非贪婪得到了Zbcdefg而不是bcdefg
        Matcher matcher = compile.matcher("bbbGGood");


        boolean b = matcher.find();
        if (b) {
            int i = matcher.groupCount();//group 0返回本身   和其他不同,,这是从1开始才表示原子。
            while (i >= 0) {
                String group = matcher.group(i);
//                String group = matcher.group();
                System.out.println("group:"+i+ ":"+ group);
                i--;

            }
        }
















上一篇下一篇

猜你喜欢

热点阅读