'12345678'.replace(/\B(?=(\d{3})+$)/g, ',') // '12,345,678'
理解上面的含義,首先需要了解正則是怎么匹配的叶骨,分步來看這個(gè)正則:
-
(\d{3})+$
從左往右以貪婪模式匹配以三個(gè)數(shù)字為一組(重復(fù)n>=1次)結(jié)尾的字符串匹层。例如:
'123'.match(/(\d{3})+$/g) // ['123']
'123456'.match(/(\d{3})+$/g) // ['123456']
'12345678'.match(/(\d{3})+$/g) // ['345678']
2.\B
mdn上是這樣解釋的:匹配一個(gè)非單詞邊界泽台。
'1'.match(/\B/g) // null
'12'.match(/\B/g) // ['']
'123'.match(/\B/g) // ['', '']
'12345678'.match(/\B/g) // ['', '', '', '', '', '', '']
例子里正則使用了
g
赏胚,所以找到的是所有符合條件的访娶。'12'.match(/\B/g)
匹配到的就是1
和2
之間的位置商虐。'123'.match(/\B/g)
匹配到的就是1
和2
,2
和3
之間的位置觉阅。12345678
依此類推找到了7個(gè)位置。
-
?=
exp1(?=exp2):查找 exp2 前面的 exp1秘车。注意這里想找的是 exp1典勇。exp2只是一個(gè)限定條件。例如:
'12a34b5'.match(/\d(?=[a-z])/g) // ['2', '4']
想找的是一個(gè)數(shù)字叮趴,這個(gè)數(shù)字的后面是一個(gè)英文字母割笙。滿足條件的只有2和4
現(xiàn)在綜合起來看:
'12345678'.match(/\B(?=(\d{3})+$)/g)
- 1.首先這個(gè)正則想匹配出所有的
\B
'12345678'.match(/\B/g) // ['', '', '', '', '', '', '']
- 2.然后匹配的
\B
后面需要滿足以三個(gè)數(shù)字為一組(重復(fù)n>=1次)結(jié)尾
'12345678'.match(/\B(?=(\d{3})+$)/g) // ['', '']
過程分析如下:
1和2之間的位置,把12345678分成了1和2345678眯亦。'2345678'總共是7個(gè)數(shù)字伤溉,不滿足第二個(gè)條件
2和3之間的位置,把12345678分成了12和345678妻率。'345678'總共是6個(gè)數(shù)字乱顾,滿足條件
3和4之間的位置,把12345678分成了123和45678宫静。'45678'總共是5個(gè)數(shù)字走净,不滿足第二個(gè)條件
4和5之間的位置券时,把12345678分成了1234和5678。'5678'總共是4個(gè)數(shù)字伏伯,不滿足第二個(gè)條件
5和6之間的位置橘洞,把12345678分成了12345和678。'678'總共是3個(gè)數(shù)字说搅,滿足條件
6和7之間的位置炸枣,把12345678分成了123456和78。'78'總共是2個(gè)數(shù)字弄唧,不滿足第二個(gè)條件
7和8之間的位置抛虏,把12345678分成了1234567和8。'8'總共是1個(gè)數(shù)字套才,不滿足第二個(gè)條件
所以符合條件的只有2和3迂猴、5和6這兩組中間的位置。
因此'12345678'.replace(/\B(?=(\d{3})+$)/g, ',')
的結(jié)果是'12,345,678'
背伴。
參考地址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
https://www.runoob.com/regexp/regexp-syntax.html