JavaScript正則表達式

JavaScript正則表達式

如下介紹正則解析過程

/(\d)(?=(\d\d\d)+(?!\d))/g.exec(100000000)

這裏要注意下x(?=y)先行斷言和x(?!y)正向否認查找兩個特殊符號的使用(Negative Lookahead)。

  • x(?=y)

匹配'x'僅僅當'x'後面跟着'y'.這種叫作先行斷言。 例如,/Jack(?=Sprat)/會匹配到'Jack'僅僅當它後面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’僅僅當它後面跟着'Sprat'或者是‘Frost’。可是‘Sprat’和‘Frost’都不是匹配結果的一部分。javascript

  • x(?!y)

匹配'x'僅僅當'x'後面不跟着'y',這個叫作正向否認查找。 例如,/\d+(?!\.)/匹配一個數字僅僅當這個數字後面沒有跟小數點的時候。正則表達式/\d+(?!\.)/.exec("3.141")匹配‘141’而不是‘3.141’html

須要注意和理解的地方
1.x(?=y) 和 xy 匹配,可是返回的匹配結果是 x
2.Lookahead表達式不會產生匹配結果java

簡化拆分後,就是()(),即第一個分組是(\d),第二個是(\d\d\d)+,兩個分組分別是$1,$2,這裏要注意

(\d)git

匹配一個數字。 等價於[0-9]。 例如, /\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。github

1.因此這裏的$1匹配的是一個0-9的數字,$2匹配的是三個數字
2.咱們注意到$2是帶+號的,表示匹配1次到無限次之間,儘量多地匹配,根據須要返回正則表達式

理解js的exec返回值

返回值express

若是匹配成功,exec() 方法返回一個數組,並更新正則表達式對象的屬性。返回的數組將徹底匹配成功的文本做爲第一項,將正則括號裏匹配成功的做爲數組填充到後面。 若是匹配失敗,exec() 方法返回 null。數組

返回參數介紹
result[0] 匹配的所有字符串
result[1], ...[n ] 括號中的分組捕獲,即以上示例的$1,$2
index 匹配到的字符位於原始字符串的基於0的索引值
input 原始字符串ide

示例中
result[0]的結果是什麼呢,按正則去劃分,100 000 000,即$1就是匹配到的所有字符串100,(\d)就是100的最後一個數值0
result[1]就是$1,因此示例中result[0]=result[1],由於$2是Lookahead表達式,因此示例中$1與匹配結果相等
result[2]就是$2,由於是從左到右匹配(向後匹配),因此最後一組就是$2的結果,即000
index是2(緣由看上面返回參數介紹)
input忽悠不介紹了函數

jPublic代碼中正則的使用

/**
     * 金額格式化
     * @param {Number}  value   原始金額數值
     * @param {Integer} digit   保留小數位置(默認2位)
     * @returns {string}
     * @alias module:_.fmoney
     * @example
     * _.fmoney(100000000)
     * =>100,000,000.00
     *
     * _.fmoney(100000000.3434343, 3)
     * =>100,000,000.343
     */
    _.fmoney = function (value, digit) {
        digit = digit > 0 && digit <= 20 ? digit : 2;
        if (typeof (value) == "undefined" || (!value && value != 0)) {
            return '';
        }
        value = parseFloat((value + "").replace(/[^\d\.-]/g, "")).toFixed(digit) + "";
        var ss = value.split(".");
        var r = ss[1];
        ss[0] = ss[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")
        return ss[0] + "." + r.substring(0, digit);
    };
  • 經過我上面的介紹,是否是很容易理解了這段代碼正則的含意啦
  • 有問題歡迎給我提issue(Github或碼雲)均可以,我看到會第一時間解決
  • 喜歡本js函數庫的朋友,歡迎給下支持哦

參考資料

JavaScript正則介紹
Lookahead表達式
exec函數介紹
正則在線測試

相關文章
相關標籤/搜索