非貪婪匹配

看風景就發表於2018-09-19

正規表示式的量詞有貪婪匹配和非貪婪匹配之分。

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

量詞包括:

{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

相關文章