美文网首页
「正则规范整理」

「正则规范整理」

作者: LYF闲闲闲闲 | 来源:发表于2019-04-16 14:24 被阅读0次

    正则表达式的定义:用来描述或匹配一系列匹配某个句法规则的字符串。

    正则的语法有哪些:

    1. 选择

    竖线 | ,最低优先级

    2. 数量限定

    + 代表符号前面的字符至少出现一次 (一次 ~ 多次)
    ?代表符号前面的字符最多可以出现一次 (0次、1次)
    * 代表符号前面的字符可以出现 (0次 ~ 多次)
    {n} 出现n次
    {n,} 最少出现n次,范围在n~∞
    {n,m} 出现次数n~m之间

    3. 匹配

    () 定义操作符的范围和优先级

    4. 正则表达式

    字符 描述 示例
    ^ 匹配开始位置 c
    $ 匹配结束位置 c
    . 匹配除\r \n 之外的单个字符 c
    \ 标记特殊字符 n、\n
    x|y 匹配x或者y c
    [xyz] 匹配x或y或z任意一个 c
    [^xyz] 匹配未列出的任意字符 c
    [a-z] 匹配a-z范围内的小写字母 c
    [^a-z] 匹配不在a-z范围内的字符 c
    \b 匹配一个单词边界 er\b : 匹配 never 中的 er ,不匹配 verb 中的 er
    \B 匹配非单词边界 er\B : 不匹配 never 中的 er ,匹配 verb 中的 er
    \d 匹配一个数字 等价于[0-9]
    \D 匹配一个非数字 等价于[^0-9]
    \f 匹配一个换页符 等价于\x0c和\cL
    \n 匹配一个换行符 等价于\x0a和\cJ
    \r 匹配一个回车符 等价于\x0d和\cM
    \s 匹配任何空白字符 等价于[ \f\n\r\t\v]
    \S 匹配任何非空白字符 等价于 [^ \f\n\r\t\v]
    \t 匹配一个制表符 等价于\x09和\cI
    \v 匹配一个垂直制表符 等价于\x0b和\cK
    \w 匹配包括下划线的任何单词字符 等价于[A-Za-z0-9_]
    \W 匹配任何非单词字符 等价于[^A-Za-z0-9_]
    \cx 匹配由x指明的控制字符,x的值必须为A-Z或a-z \cM匹配一个Control-M或回车符。\ca等效于\u0001, \cb等效于\u0002
    (pattern) 用括号括起来表示一个子模式,匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用
    (?:pattern) 匹配pattern但不获取匹配的子字符串 industr(?:y | ies), industry | industries
    (?=pattern) 正向肯定预查,非获取匹配
    (?!pattern) 正向否定预查,非获取匹配
    (?<=pattern) 反向肯定预查,非获取匹配
    (?<!pattern) 反向否定预查,非获取匹配
    正则表达式的获取匹配和非获取匹配

    用括号括起来表示一个子模式,这个子模式就是一个获取匹配,如果在子模式的前面加上 ?:、 ?! 、?<=、 ?<!,就成为非获取匹配

    <div id="test">
    Windows 103
    Windows 95 and Windows 98 are the successor.
    Then Windows 2000 and Windows Xp appeared.
    Windows Vista is the Latest version of the family. 
    </div>
    <button onclick='reg_replace()'>替换</button>
    
    function reg_replace()
    {
      var test = document.getElementById("test");
      var regex = /(Windows [\w]+\b)/g; // 加上括号获取匹配
      var regex2 = /Windows [\w]+\b/g; // 去掉括号 非获取匹配
      var regex3 = /(?:Windows [\w]+\b)/g; //加上?: 非获取匹配
      test.innerHTML = test.innerHTML.replace(regex,"<span style='background-color:orange'>$1</span>");
    }
    
    获取匹配 非获取匹配

    获取匹配会把子模式中保存起来,用于向后引用,同时可以使用$1引用,一个括号代表一个子模式,$1 表示匹配第一个括号里的字符串,如果有多个()包含,顺序依次向后加 $1 $2 $3 ……$n

    非获取匹配

    (?:pattern) 匹配结果。Java(?:6|7)等效于Java6|Java7,在需要使用()的情况下,同时不需要把匹配的内容进行保存,后面也不需要引用,可以用这种方式,同时也是对资源的节约
    在非获取匹配下,也不会拥有分组的组号

    零宽断言

    零宽度的匹配,查找某个内容之前或者之后的内容,匹配的内容不会保存到对应的匹配结果中,仅仅匹配了一个位置。

    1. 正向预查

    (?=pattern) 正向匹配。Java(?=6),匹配后面跟着6的Java

    (?!pattern) 正向不匹配。Java(?!6),匹配后面不跟着6的Java

    2. 反向预查

    (?<=pattern) 反向匹配。(?<=J)a,匹配紧跟字母J后面的a

    (?<!pattern) 反向不匹配。(?<!J)a,不匹配紧跟字母J后面的a

    正则replace特殊标记符$
    字符 替换文本
    $1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
    $& 与 regexp 相匹配的子串。
    $` 位于匹配子串左侧的文本。
    $' 位于匹配子串右侧的文本。
    $$ 直接量符号。
    正则replace应用—千分制
    // 整数千分制
    let a = '99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');
    // 可以包含小数点后两位的千分制
    var b = '99999999999.02'.replace(/\d{1,3}(?=(\d{3})+(?:\.\d{1,2})?$)/g, '$&,');
    
    正则符号的优先级
    优先权 符号
    最高 \
    ()、(?:)、(?=)、[]
    *、+、?、{n}、{n,}、{n,m}
    ^、$、中介字符
    次最低 串接,即相邻字符连接在一起
    最低 |
    正则的贪婪&非贪婪

    贪婪模式,匹配尽可能多的,属于贪婪模式的量词包括 {n,m} {m,} ? * +
    非贪婪模式,匹配尽可能少的,在贪婪模式基础上再加上?即为非贪婪模式。

    var str='aabab';
    var reg=/a.*?b/g;
    var res=str.match(reg);
    console.log(res); 
    

    结果:

    ["aab", "ab"]
    

    先匹配aab,再匹配ab,由于从左向右最先开始的匹配有最高优先级

    相关文章

      网友评论

          本文标题:「正则规范整理」

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