非贪婪匹配

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

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

量词包括:

{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

原文地址:https://www.cnblogs.com/mengff/p/9675290.html