騰訊曾經出過這樣一道面試題:
如何給一串數字用千分製表示?好比9999999999變成9,999,999,999
你們可能會說:用操做字符串的辦法作,變成字符串,先除以3,看有幾對,而後再加逗號…………(省略無數個步驟,這實在是太麻煩啦。。)
也有小夥伴說,能夠用(123456789.123).toLocaleString('en-US')
。沒錯,可是本文的思想是想要探討如何用正則來解答,旨在熟悉正則。(tips:.toLocaleString('en-US')
不能對小數點後超過3位的數字進行,
分割)
面試
那麼,讓咱們咱們先爲解答這道題來了解一些相關的概念吧!
正則表達式
寫法 | 名稱 | 含義 |
---|---|---|
exp1(?=exp2) | 正向前瞻 | 查找exp2前面的exp1 |
(?<=exp2)exp1 | 負向前瞻 | 查找exp2後面的exp1 |
exp1(?!exp2) | 正向後瞻 | 查找後面不是exp2的exp1 |
(?<!exp2)exp1 | 負向後瞻 | 查找前面不是exp2的exp1 |
Tips: 關於零寬斷言的叫法有不少種。本文提到的這幾種網上都要涉及到。 下面的正向先行斷言就是正向前瞻,是咱們解題要用到的。bash
爲了更方便你們理解,舉一個例子:微信
'中國人'.replace(/中(?=國人)/, 'rr')
輸出:rr國人
複製代碼
'中國人'.replace(/(?<=中國)人/, 'rr')
輸出:中國rr
複製代碼
'中國人中'.replace(/中(?!國人)/, 'rr')
輸出:"中國人rr"
複製代碼
'中國人中'.replace(/中(?<!國人)/, 'rr')
輸出:"rr國人中"
"abZWab863ab88".replace(/(?<![A-Z])ab/g, "")
輸出:"ZWab86388"
複製代碼
關於騰訊的這道面試題:
如何給一串數字用千分製表示?好比9999999999變成9,999,999,999。要想解答這道題,須要瞭解如下幾個知識點:spa
1. replace()方法與正則約定的特殊標記符$code
寫法 | 含義 |
---|---|
$i | (i:1-99),表示從左到右正則子表達式所匹配的文本 |
$& | 表示與正則表達式匹配的全文本 |
$` | `:切換技能鍵。表示匹配字符串左邊的文本 |
$$ | 表示$轉移 |
2. 分組語法:cdn
寫法 | 含義 |
---|---|
捕獲 | |
(exp) | 匹配exp,並捕獲到自動命名到組裏 |
(?<name>exp) | 匹配exp,並捕獲文本到名稱爲name到組裏 |
(?:exp) | 匹配exp,不捕獲匹配的文本 |
位置指定 | |
exp1(?=exp2) | 查找exp2前面的exp1 |
(?<=exp2)exp1 | 查找exp2後面的exp1 |
exp1(?!exp2) | 查找後面不是exp2的exp1 |
(?<!exp2)exp1 | 查找前面不是exp2的exp1 |
註釋 | |
(?#comment) | 這種類型的組不對正則表達式對處理產生任何影響,只是爲了提供讓人閱讀註釋 |
解析:blog
epx1(?=epx2)
(正向前瞻)\d
。\d{1-3}
。,
epx2
的正則表達應該是:(\d{3}+$)
(+:出現1次或屢次;$:限定以xxx結尾)$&
符號。$&,
表示捕獲與正則表達式匹配的全文本
並置換爲,
'99999999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,')
接下來:作一道擴展題: 有小數點的'99999999999.02'
作千分之轉換,要怎樣寫呢?ip
'99999999999.02'.replace(/\d{1,3}(?=(\d{3})+(?:\.\d+)?$)/g, '$&,')
輸出:"99,999,999,999.02"
'99999999999.33333333'.replace(/\d{1,3}(?=(\d{3})+(?:\.\d+)?$)/g, '$&,')
輸出:"99,999,999,999.33,333,333"
複製代碼
正則表達式的寫法大多數的時候都不止一種。 千分之表達的另外的一種寫法是:字符串
"123456789.12123".replace(/(?!^)(?=(\d{3})+(?:\.\d+)?$)/g, ',')
複製代碼
Tips: 這種寫法與以前的寫法最大的區別就是:將exp1的部分改成限定字符串的開頭不能夠添加,
結尾: 謝謝你們閱讀,若是以爲對你有幫助,請給做者一點小小的鼓勵, 點個贊或者收藏吧。 有須要溝通的請聯繫我: 微信( wx9456d) 郵箱( allan_liu986@163.com )