javascript 正則(將數字轉化為三位分隔的樣式)


1 '12345678912345678'.replace(/\B(?=(?:\d{3})+\b)/g, ',')

解釋:

\b : 匹配單詞邊界,就是位於字符\w([a-zA-Z0-9_])和\W[^a-zA-Z0-9_]之間的位置,或者位於字符\w和字符串的開頭或者結束之間的位置。

\B : 匹配非單詞邊界

var reg = /\b\d/g;
var str = '123';
reg.exec(str);//["1",index:0,input:"123"]
reg.exec(str);//null

reg = /\d\b/g;
reg.exec(str);//["3",index:2,input:"123"]
reg.exec(str);//null

reg = /\B\d/g;
reg.exec(str);//["2", index: 1, input: "123"]
reg.exec(str);//["3", index: 2, input: "123"]
reg.exec(str);//null


reg = /\d\B/g;
reg.exec(str);//["1", index: 0, input: "123"]
reg.exec(str);//["2", index: 1, input: "123"]
reg.exec(str);//null

通過上面代碼可以理解\b和\B到底是什么玩意了。

`(?:exp)`:正則表達式中小括號具有分組和捕獲雙重作用,如果在小闊號里面開始加上`?:`則可以使其不被捕獲。
`exp1(?=exp2)`:正向前瞻(零寬正向先行斷言,零寬的意思是(?=exp2)不占據位置,只是表示一個期望),要匹配的exp1要滿足后面是exp2
`exp1(?!exp2)`:負向前瞻(零寬負向先行斷言),要匹配的exp1要滿足后面是不是exp2
var str = '你好嗎 你好啊 你好呀';
var reg = /好(?=啊)/g;
reg.exec(str);//["好", index: 5, input: "你好嗎 你好啊 你好呀"]
reg.exec(str);//null
reg = /好(?!啊)/;
reg.exec(str);//["好", index: 1, input: "你好嗎 你好啊 你好呀"]
reg.exec(str);//["好", index: 9, input: "你好嗎 你好啊 你好呀"]
reg.exec(str);//null
//說明一下零寬,下面這個正則表示`你`的后面要緊跟着`好`才能匹配,期望后面是`好`!
//但是后面緊跟着一個`\d`,理解的時候把`(?=好)`忽略(因為是零寬,不占據位置),
//這就表示在`你`的后面要跟一個數字才能匹配,這就跟上面那個期望相互矛盾,
//因此這個正則不會匹配任何字符串。
reg = /你(?=好)\d/;
reg.exec(str);//null
reg.test(str);//false
reg.test('你好');//false
reg.test('你好1');//false
reg.test('你1好');//false
 
再看`/\B(?=(?:\d{3})+\b)/g`什么意思
1. 首先是全局匹配
2. 匹配非單詞邊界
3. 非單詞邊界后面有(連續3的整數被個數字加單詞邊界)
4. 連續的數字不會被捕獲
`'123456789'.replace(/\B(?=(?:\d{3})+\b)/g, ',')`
執行過程:
replace函數會進行多次匹配,\b表示了要匹配到單詞邊界。
1. 首先從1和2中間開始但是后面有8個數字不滿足前瞻性條件
2. 然后到2和3中間,同樣不滿足
3. 到3和4中間,滿足后面有6個數字
4. 把在3和4中間的\B(非單詞邊界)替換為","。
5. 依次往下匹配替換
6. 最終返回新的字符串"123,456,789"

正則很強大,比常規的實現方法簡潔方便很多。
 
         
         
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM