JavaScript正则表达式--非贪婪模式截取任意字符串的笔记

Posted Sodino

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript正则表达式--非贪婪模式截取任意字符串的笔记相关的知识,希望对你有一定的参考价值。

文章目录
  1. 1. 场景
  2. 2. 正则表达式一
  3. 3. 正则表达式二
  4. 4. 排查问题
  5. 5. 正则表达式三
  6. 6. 结论

场景

要将下面的字符串截取两个title:***,url:***来。

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        <script>
        
       
       
        title:
        'RegExp 对象参考手册',url:
        'http://sodino.com/regexp.asp',
       
       
        title:
        'w3cSchool script', url:
        'http://www.w3cSchool.com',
       
       
        
       
       
        </script>
       

正则表达式一

       
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        var 
        string 
        = 
        '<script>'
       
       	
        +
        "title:'RegExp 对象参考手册',url:'http://sodino.com/regexp.asp',"
       
       	
        +
        "title:'w3cSchool script', url:'http://www.w3cSchool.com',"
       
       	
        +
        ""
       
       	
        +
        '</script>';
       
       
       
        var reg 
        = 
        /
        \\
        .
        +\\/g;  
        // 正则表达式
       
       
       
        var result 
        = 
        string
        .
        match(reg);
       
       
        console
        .
        log(result);
       

这个毫无疑问是全匹配,即输出为第一个到最后一个之间的全部内容:

       
        1
       
       
        2
       
       
        D:
        \\github
        \\niVoVin>node test.js
       
       
        [ '
        title:
        \\'RegExp 对象参考手册
        \\',url:
        \\'http://sodino.com/regexp.asp
        \\'
        ,
        title:
        \\'w3cSchool script
        \\', url:
        \\'http://www.w3cSchool.com
        \\'
        ,
        
        ' 
        ]
       

正则表达式二

书上说在表达式的后面加上?就是非贪婪模式了。即n?匹配包含零个或一个n的字符串。
那么目前想的是只匹配一个,那么将表达式修改为如下:

       
        1
       
       
        var reg = 
        /\\.+\\?/g;
       

运行一下代码,发现输出是竟然是第一个到字符串结尾:

       
        1
       
       
        2
       
       
        D:
        \\github
        \\niVoVin>node test.js
       
       
        [ '
        title:
        \\'RegExp 对象参考手册
        \\',url:
        \\'http://sodino.com/regexp.asp
        \\'
        ,
        title:
        \\'w3cSchool script
        \\', url:
        \\'http://www.w3cSchool.com
        \\'
        ,
        
        </script>' 
        ]
       

?的作用竟然是忽略吗?
陷入了深深的疑惑……


排查问题

当表达式一和表达式二对比时,直觉告诉你是由于引入?才导致的错误。
那么需要来验证下。

       
        1
       
       
        var reg = 
        /script>?/g;
       

更换表达式,验证是否?一样会忽略掉>???
执行输出得到:

       
        1
       
       
        2
       
       
        D:\\github\\niVoV
        in>node test.js
       
       
        [ 
        'script>', 
        'script', 
        'script>' ]
       

所以?并不是忽略的作用。所以直觉不对。

再看表达式二的输出结果,结果是将第一个后的内容全部输出,那就是说表达式二的结果是由于一直在匹配.+(任意数量的任意字符,除了换行和结束符),而没有匹配到截止符?的原因。
而由于?处于可匹配可不匹配的情况,解释器优先选择不匹配,导致截止符是无效的。
参考链接正则基础之——贪婪与非贪婪模式

那么解决办法就变为截止符不可设置为非贪婪,这样才有截止作用,而对应的是对.+(任意字符)执行非贪婪匹配,尽可能少的匹配之间的内容。


正则表达式三

正则表达式贪婪与非贪婪模式

python正则表达式贪婪与非贪婪模式

JavaScript正则表达式二

全网最易懂的正则表达式教程(8 )- 贪婪模式和非贪婪模式

第11.9节 Python正则表达式的贪婪模式和非贪婪模式

正则表达式贪婪和非贪婪模式

(c)2006-2024 SYSTEM All Rights Reserved IT常识