zoukankan      html  css  js  c++  java
  • 非贪婪匹配

    正则表达式的量词有贪婪匹配和非贪婪匹配之分。

    贪婪匹配: 匹配成功前提下,尽可能多的匹配
    非贪婪匹配: 匹配成功前提下,尽可能少的匹配

    量词包括:

    {m, n}
    {m, }
    ?
    *
    +

    以上默认分为贪婪模式,若要改为非贪婪模式,只在量词后面加个?就行了:

    {m, n}?
    {m, }?
    ??
    *?
    +?

    1. 举例

    // 即为字符串高亮为红色  
    function hightlight(str){  
        return "<font color=red>"+str+"</font>";  
    }  
    
    //使用贪婪模式
    var reg = new RegExp('(a+)');  
    var str = 'aaa';  
    var newstr = str.replace(reg, hightlight);  
    document.write(newstr + "<br/>");   

    输出:aaa

    //非贪婪模式
    var reg = new RegExp('(a+?)'); 
    var str = 'aaa';  
    var newstr = str.replace(reg, hightlight);  
    document.write(newstr + "<br/>");   

    输出:aaa

    //非贪婪模式,正则是从左到右匹配,直到匹配为止,所以此处会匹配aaab,而不是ab或b
    var reg = new RegExp('(a*?b)');  
    var str = 'aaab';  
    var newstr = str.replace(reg, hightlight);  
    document.write(newstr);   

    输出: aaab

    2. 应用

    var str = "[DTools]              [logs]                [Program Files]"

    要匹配上面字符串中的[]中的单词

    //贪婪匹配
    "\[([^\]]+)\]"
    
    //非贪婪匹配
    "\[(.+?)\]"

    非贪婪匹配会用最小边界匹配,不用考虑中间字符的排除问题,写起来更简洁。

    参考:https://blog.csdn.net/yiifaa/article/details/76473282
             http://lullabyus.iteye.com/blog/1442347

  • 相关阅读:
    STM32 变量无法赋值问题
    ROS 多台计算机联网控制机器人
    Content-Disposition
    Arrays.asList()与toArray()
    length与size()
    computeIfAbsent
    共享锁、排他锁与意向锁
    行锁、页面锁与表锁
    classpath是什么
    start、run、join
  • 原文地址:https://www.cnblogs.com/mengff/p/9675290.html
Copyright © 2011-2022 走看看