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

  • 相关阅读:
    c++ 左值、右值;左值引用、右值引用
    leetcode 837 新21点
    c++ 继承和组合
    ubuntu 16.04 常用命令小结
    vim 常用命令小结(转)
    leetcode 1371. 每个元音包含偶数次的最长子字符串 (状压 + 前缀和 +hash)
    leetcode 974 和可被K整除的子数组
    leetcode 910 最小差值II
    关于 mysqladmin
    PHP闭包(Closure)初探
  • 原文地址:https://www.cnblogs.com/mengff/p/9675290.html
Copyright © 2011-2022 走看看