正则表达式

作者: squall1744 | 来源:发表于2017-11-04 10:53 被阅读0次

    先上干货,两个强烈推荐网站
    正则表达式可视化
    正则表达式在线工具

    下面是正文了,其实也不是什么正文,就是点总结的笔记吧,其实最精华的就是上面那两个网站,下面大家想看就看不想看就不看了吧

    元字符

    ( [ { \ ^ $ | ) ? * + .

    字符 含义
    \t 水平制表符
    \r 回车符
    \n 换行符
    \f 换页符
    \cX 与X对应的控制字符(Ctrl + X)
    \v 垂直制表符
    \0 空字符

    字符类

    一般情况下一个字符对应字符串一个字符,如表达式 abc的含义就是


    匹配单个字符串

    范围类

    使用[]可以表示一类字符

    [a-zA-Z0-9] //匹配所有字母(包括大小写)和数字
    
    匹配一类字符

    预定义类

    字符 等价类 含义
    . [^\r\n] 除了回车和换行符之外的所有字符
    \d [0-9] 数字字符
    \D [^0-9] 菲数字字符
    \s [\t\n\x0B\f\r] 空白符
    \S [^\t\n\x0B\f\r 非空白符
    \w [a-zA-Z0-9_] 单词字符,字母、数字和下划线
    \W [^a-zA-Z0-9_] 非单词字符,字母、数字和下划线

    学了上面这些类,我们写一些正则表达式就很方便了,比如我们希望匹配一个ab+数字+任意字符,可以这么写:

    ab\d.
    
    ab\d.
    字符 含义
    ^ 以xxx开头
    $ 以xxx结尾
    \b 单词边界
    \B 非单词边界

    例如,我们要匹配一个字符串为国内手机号可以用下面代码

    ^1[3578]\d{9}$
    
    匹配国内电话号码

    量词

    字符 含义
    ? 出现零次或一次(最多出现一次)
    + 出现一次或多次(至少出现一次)
    * 出现零次或多次(任意次)
    {n} 出现n次
    {n,m} 出现n到m
    {n,} 至少出现n次
    {,m} 最多出现m次

    举例

    'a12345678cde'.match(/[a-z]\d?/g)
    > ['a1', 'b6', 'c', 'd', 'e']
    
    [a-z]\d?

    贪婪模式和非贪婪模式

    量词在默认情况下是尽可能多的匹配的,也就是大家说的贪婪模式

    '123456789'.match(/\d{3,5}/g)
    >['12345', '6789']
    

    非贪婪模式下,正则表达式尽可能少的匹配,做法很简单,在量词后面加上?即可

     '123456789'.match(/\d{3,5}?/g)
     >['123', '456', '789']   
    

    举例

    //贪婪模式
    'a12345b678ced'.match(/[a-z]\d?/g)
    >['a1', 'b6', 'c', 'd', 'e']
    //非贪婪模式
    'a12345b678ced'.match(/[a-z]\d??/g)
    >['a', 'b', 'c', 'd', 'e']
    
    //贪婪模式
    'a12345b678ced'.match(/[a-z]\d+/g)
    >['a12345', 'b678']
    //非贪婪模式
    'a12345b678ced'.match(/[a-z]\d+?/g)
    >['a1', 'b6']
    
    //非贪婪模式
    'a12345b678ced'.match(/[a-z]\d*?/g)
    >['a', 'b', 'c', 'd', 'e']
    

    分组

    单个字母加量词只能对一个字母匹配多次,有时候我们需要对多个字符同时使用量词,如希望匹配某个单词出现多少次的字符串,我们如果写成word{20}话匹配的是wor+d重复20次

    word{20}
    
    word{20}

    如果怎样才能把word看成一个整体呢?使用()就可以了,这就是我们所说的分组

    (word){20}
    
    (word){20}

    我们需要匹配word或者number出现20次怎么弄?使用|即可
    (word|number){20}
    
    (word|number){20}

    前瞻

    正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的,因此对于文本尾部方向,因为这个时候正则引擎还没走到那块,所以他是正则的前方。而对文本头部方向,因为正则引擎已经走过了那一块地方,所以他是正则的后方。如下图所示:

    正则表达式的方向

    前瞻表达式

    表达式 含义
    exp1(?=exp2) 匹配后面是exp2的exp1
    exp1(?!exp2) 匹配后面不是exp2的exp1

    举例

    good(?=word)
    
    good(?=word)
    (/good(?=game)/).exec('goodgame123'); //['good']
    (/good(?=game)/).exec('goodluck123'); //null
    (/good(?=game)/).exec('goodmum123'); //null
    

    通过上面的例子可以看出只有在exp1后面的表达式是exp2的时候才会匹配exp1

    结束语

    关于正则表达式的常用语法,我们就讲完了,其实就常用语法来说,正则表达式并没有什么太多的内容,但是用起来呢就。。。。

    相关文章

      网友评论

        本文标题:正则表达式

        本文链接:https://www.haomeiwen.com/subject/ltwapxtx.html