標籤:blank blog 單詞 替換 col htm exec rip 因此
原文:https://www.cnblogs.com/sivkun/p/7123963.html
‘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);//nullreg = /\d\b/g;reg.exec(str);//["3",index:2,input:"123"]reg.exec(str);//nullreg = /\B\d/g;reg.exec(str);//["2", index: 1, input: "123"]reg.exec(str);//["3", index: 2, input: "123"]reg.exec(str);//nullreg = /\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)`:Regex中小括弧具有分組和捕獲雙重作用,如果在小闊號裡面開始加上`?:`則可以使其不被捕獲。
`exp1(?=exp2)`:正向前瞻(零寬正向先行斷言,零寬的意思是(?=exp2)不佔據位置,只是表示一個期望),要匹配的exp1要滿足後面是exp2
`exp1(?!exp2)`:負向前瞻(零寬負向先行斷言),要匹配的exp1要滿足後面是不是exp2
var str = ‘你好嗎 你好啊 你好呀‘;var reg = /好(?=啊)/g;reg.exec(str);//["好", index: 5, input: "你好嗎 你好啊 你好呀"]reg.exec(str);//nullreg = /好(?!啊)/;reg.exec(str);//["好", index: 1, input: "你好嗎 你好啊 你好呀"]reg.exec(str);//["好", index: 9, input: "你好嗎 你好啊 你好呀"]reg.exec(str);//null//說明一下零寬,下面這個正則表示`你`的後面要緊跟著`好`才能匹配,期望後面是`好`!//但是後面緊跟著一個`\d`,理解的時候把`(?=好)`忽略(因為是零寬,不佔據位置),//這就表示在`你`的後面要跟一個數字才能匹配,這就跟上面那個期望相互矛盾,//因此這個正則不會匹配任何字串。reg = /你(?=好)\d/;reg.exec(str);//nullreg.test(str);//falsereg.test(‘你好‘);//falsereg.test(‘你好1‘);//falsereg.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"
正則很強大,比常規的實現方法簡潔方便很多。
javascript 正則(將數字轉化為三位分隔的樣式)【轉】