1. 程式人生 > >javascript正則表示式之最長匹配(貪婪匹配)和最短匹配(懶惰匹配)

javascript正則表示式之最長匹配(貪婪匹配)和最短匹配(懶惰匹配)

最近在閱讀RequireJS 2.1.15原始碼,原始碼開始處定義了一系列的變數,有4個正則表示式:

var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
        cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
        jsSuffixRegExp = /\.js$/,
        currDirRegExp = /^\.\//;

commentRegExp正則用來匹配javascript程式碼中的註釋,/m的用法可以參考這篇文章,/g的用法參考

這篇文章commentRegExp中的*?這種用法之前沒有見過,覺得很奇怪,因為*在正則表示式中代表0個或任意多個,?代表0個或1個,剛開始覺得*?這種寫法很多餘。請教同事才知道,*?這種寫法是懶惰匹配。

alert(/abc([\w]*)/mg.exec("abc1abc2")[0]);//abc1abc2
alert(/abc([\w]*?)/mg.exec("abc1abc2")[0]);//abc


通過下面這段程式碼可以看出:最長匹配和最短匹配的差別通過這段程式碼可以看出:最長匹配和最短匹配的差別,一個匹配儘可能多的字元,一個匹配儘可能少的字元。一般正則表示式引擎預設都是最長匹配的,如果我們想要最短匹配,那麼可以在數量修飾符後面新增一個?變成最短匹配。

/***註釋1****/ var name = "aty"; /***註釋2****/
var name = "aty";

通過上面這段程式碼可以知道,為啥requirejs匹配javascript註釋要採用*?這種最短匹配模式了吧。如果我們要刪除所有註釋,那麼應該採用最短匹配,否則var name="aty";這段程式碼會被替換掉。