正则表达式入门学习

        正则表达式是什么: 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码

   

         

          https://regexr-cn.com/

          https://www.codejiaonang.com/#/     这个练习网站写的很好,也很适合用来回忆和查询正则表达式的规则

          https://codejiaonang.com/#/course/regex_chapter2/0/0      进阶课程

          还想进一步深入了解使用学习的,还可以看这个网站进行相关知识补充:https://deerchao.cn/tutorials/regex/regex.htm

            

 

常用的通配符:

   单个字符匹配:

        .   可用于匹配除了回车换行以外的任意一个字符,它只能出现在方括号以外

         值得注意的是: .字符只有一个不能匹配的字符,也就是换行符(\n),不过要让.字符与换行符匹配也是可以的,以后会讨论。

       [ ]   可用于匹配包含在方括号内的任意一个字符,且里面都是或的关系,比如[abcd]也就是abcd都会有可能被匹配到

            使用[ ]来进行字符匹配,匹配中括号内的元素任意一次,例如:[Pp]ython    就是可以匹配下面三种字符串:

                

            [^ ] 表示取反,可用于匹配除了方括号以外的任何字符,例如:[^abcd]可以匹配到除了abcd以外的任意字符

            -  这个符号可以表示范围

            [a-z]  匹配所有的小写字符

            [A-Z]  匹配所有的大写字符

            [0-9]   匹配所有的数字

            [a-zA-Z0-9]   可以匹配括号内写的所有字符

       但是上面的写法太复杂,可以进行简写:

             使用\w表示所有的字母字符,\d代表所有的数字字符,\s表示所有的空白字符,比如空格、tab、换行等。

                   记忆方法:word(单词)   digital(数字)    space(空格)

              \b可以匹配单词的边界,也就是被前后都有\b包围的单词要作为一个完整的单词才会被匹配。

                     

                 同样地,快捷方式也是可以取反的,取反的时候只要把原来的小写字母改成大写字母就可以了,具体见下图:

                      

     

       多个字符匹配:

              匹配数量控制表示法:

                    *表示:匹配0个或者n个*前面的字符           例如: a*   表示匹配0个a或者n个a    如果被匹配字符串是bbbbbb,  那么也会被匹配,只是被匹配到的是最开始的b前面的那个空白缝隙     如果是ab*匹配的是空,a或者ab,或者abb....

                  +表示:匹配1个或n个前面的字符,例如ab+表示匹配ab或者abb或者更多

                  ?表示:匹配0个或者1个前面的字符,例如ab?匹配的是a或者ab,也就是?表示问号前面出现的字符是可选字符,可以选择出现也可以选择不出现,即出现0次或1次。 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次

            

               * + ?是修饰前一个字符的,所以如果你看到*  +  ?任意有出现在一起的情况一定是一个错误的表达式

          如果像匹配到特定数量的字符,可以使用{ },   比如:a{2}表示匹配两个a,    如果想匹配两个以上的a,可以加一个,像这样写:a{2,}     如果想匹配两个到四个a,可以这样写:a{2,4}

            .可以表示任意字符,但是它只能出现在方括号以外,.字符只有一个不能匹配的字符,也就是换行符(\n),不过如果想让.字符和换行符匹配也是可以的。

             例如:

                 

                 

 

        重复:

            在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。

                    \d{9}表示重复9次,也就是需要匹配9个数字。{ }中表示的是重复次数。

            重复区间:可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。这里重复区间就可以出场了,语法:{M,N}M是下界而N是上界。

            \d{8,9}表示既可以匹配连续的8个数字,也可以匹配连续的9个数字,但是由于正则表达式默认是贪婪的,所以当有连续的九个数字的时候就不会匹配八个数字了。但是这个时候可以通过问号来解决,问号可以去除正则表达式默认的贪婪,从而处于非贪婪模式,让它在出现上面那种情况的时候只匹配8个数字,也就是这种写法:    \d{8,9}? 

          有时候遇到的字符组的重复次数也会没有边界,闭区间不写即可表示匹配一个或无数个。例如: \d{1, }   这样就表示匹配一个及以上个数的数字:

                

        于是我们常用{0,}和{1,},因此用一种速写的方式来表示,使用+来匹配1个到无数个,使用*来匹配0个到无数个。也就是+等价于{1,}     *等价于{0,}    具体示例见下:

           

          

 

          

 

 

    总结:

               

               

 

正则表达式进阶:

     分组:

       在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。要实现分组很简单,使用()即可。分组有一个非常重要的功能——捕获数据。所以()被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。  

          ()内的东西表示一个整体,可以一起提取出来,可以作为数据字段的提取工具。

         

             

              

          使用分组的同时还可以使用 或者or)条件。例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号:

         

        

     非捕获分组:   

                  有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组

            

           

 

            比如如果要匹配下面的字段,可以写成上面的正则表达式,使用()可以提取出对应位置的内容

            

            

             每个对应提取的部分默认会自己命名,分成group1、group2...   而其实full match是group  0, 表示完整的匹配项,group的次序就是从左到右依次数括号,有括号的嵌套也是一样的仍然是按照括号的顺序。

       也可以自己去命名,给对应的部分,格式是这样的:              (?P<name>.....) 就是使用?P< >来进行命名。比如像下面这样,重新命名以后:

     

       

         当然,括号还有一个最基本的用法,也就是可以把括号作为一个整体,比如如果要匹配n个hello world,只要像下面这样做:

                     

      

         就像人性是贪婪的,正则表达式默认也是贪婪的,具体体现在* 这个符号,默认尽可能匹配多的内容,然后如果在*后面接上一个?它就会尽可能匹配少的内容,例子如下:

                     

 

  使用或|这个符号实现一个正则表达式来匹配三种不同的情况:

           

 

     ^不放在括号里面,而是放在一个字符区间的开头时,它可以用于指定一个字符串的开始,$则可以用于指定一个字符串的结束,代表行尾。这两个符号在实际应用场景中经常使用:

          

        比如  ^\s$   就是代表空白,也就是中间只有空白的字符。  而  ^\s*$ 表示中间空白的字符有可能有也有可能没有。一个匹配的例子:

       

 

       分组的回溯引用:

           正则表达式还提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个子匹配,该匹配接下来会再次出现。例如,要匹配一段 HTML 代码,比如:0123<font>提示</font>abcd,可能会编写出这样一段正则表达式:

               

             这确实可以匹配,不过可能还有另一种情况,如果数据改成这样:<font>提示</bar>

     

        在这里font 和 bar 明显不是一对正确的标签,但是我们编写的正则表达式还是将它们给匹配了,所以这个结果是错误的。

        我们想让后面分组的正则也匹配font,但是现在所有形式的都会匹配。

        那如果想让后面分组的正则和第一个分组的正则匹配同样的数据该如何做呢?

        可以使用分组的回溯引用,使用\N可以引用编号为N的分组,因此上述例子的代码我们可以改为:

               

        通过这个例子,可以发现 \1 表示的就是第一个分组,在这里第一个分组匹配的是 font 所以\1 就代表font。也就是分别用括号包起来的,然后再对应1和2。

          

           

          

     断言:

                正向先行断言:

                       

                        先行断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的字符串:

                               

 

                        (?=.*?[a-z])(?=.*?[A-Z]).+ 这段正则表达式规定了匹配的字符串中必须包含至少一个大写和小写的字母

 

                       

                       

 

              反向先行断言:

                      

                            

                              

 

                正向后行断言:

                              

                               

                          

                反向后行断言:       

                                

                                                         

                                 前面和后面都不能是美元符号,以及中间不能再有美元符号,然后提取出中间的内容。                                                                     

                                   

 

 

 

 

 

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值