天天看點

/\B(?=(?:\d{3})+$)/g 一條令人費解的正規表達式

網上浏覽部落格看到要用JavaScript正規表達式解決一個功能, 要在數字中間插入逗号, 用來表示書面的金額寫法.

JS代碼是這樣子的

let test1 = '1234567890'
let format = test1.replace(/\B(?=(?:\d{3})+$)/g, ',')      

裡面那條正規表達式花了我一個下午去查資料, 算是補了下對于正規表達式認識上的一些漏洞, 記錄下來.

這裡有幾個概念: 單詞邊界 和 非捕獲分組(non-capturing group)

\B 比對非單詞邊界, 即兩邊都是單詞 \w = [0-9a-zA-Z] , 可是非單詞邊界太泛了, 我們需要一些限定詞.

?= 就是一個限定詞, 限定後面的字元串都是符合 (?:\d{3})+$  這個規則. 這裡面最難了解的應該就是 ?: 這是一個非捕獲分組, 當比對到 一個或多個 緊靠末尾 的三位數時, 這個規則生效, 但并不儲存這個分組.

是以整個的意思就是, 我要比對單詞之間的縫隙, 每個縫隙都在一個或多個 緊靠末尾 的三位數之間, 于是 12345678 比對到的位置就會是 12 | 345 | 678. 

你可能會問, 123456789為什麼不會比對到第一個位置呢? 因為 \B 確定了這個縫隙隻會位于兩個單詞\w之間.

以上就是全部的了解.

轉載于:https://www.cnblogs.com/andrew-chen/p/7527433.html