踩坑俠:Js正則(零寬斷言)解決騰訊面試題

Hi,你們好,我是踩坑俠! 今天給你們帶來關於正則匹配的一個面試題的分享。若是你們以爲有幫助,記得 點個贊呀!




前言:

騰訊曾經出過這樣一道面試題:
如何給一串數字用千分製表示?好比9999999999變成9,999,999,999

你們可能會說:用操做字符串的辦法作,變成字符串,先除以3,看有幾對,而後再加逗號…………(省略無數個步驟,這實在是太麻煩啦。。)
也有小夥伴說,能夠用(123456789.123).toLocaleString('en-US')。沒錯,可是本文的思想是想要探討如何用正則來解答,旨在熟悉正則。(tips:.toLocaleString('en-US')不能對小數點後超過3位的數字進行,分割)
面試

那麼,讓咱們咱們先爲解答這道題來了解一些相關的概念吧!
正則表達式

1. 零寬斷言

寫法 名稱 含義
exp1(?=exp2) 正向前瞻 查找exp2前面的exp1
(?<=exp2)exp1 負向前瞻 查找exp2後面的exp1
exp1(?!exp2) 正向後瞻 查找後面不是exp2的exp1
(?<!exp2)exp1 負向後瞻 查找前面不是exp2的exp1

Tips: 關於零寬斷言的叫法有不少種。本文提到的這幾種網上都要涉及到。 下面的正向先行斷言就是正向前瞻,是咱們解題要用到的。bash

爲了更方便你們理解,舉一個例子:微信

  1. 正向先行斷言(正向零寬斷言)
'中國人'.replace(/中(?=國人)/, 'rr')
輸出:rr國人
複製代碼
  1. 反向先行斷言
'中國人'.replace(/(?<=中國)人/, 'rr')
輸出:中國rr
複製代碼
  1. 負正向先行斷言(負向零寬斷言)
'中國人中'.replace(/中(?!國人)/, 'rr')
輸出:"中國人rr"
複製代碼
  1. 負反向先行斷言
'中國人中'.replace(/中(?<!國人)/, 'rr')
輸出:"rr國人中"

"abZWab863ab88".replace(/(?<![A-Z])ab/g, "")
輸出:"ZWab86388"
複製代碼



2.解題思路:

關於騰訊的這道面試題:
如何給一串數字用千分製表示?好比9999999999變成9,999,999,999。要想解答這道題,須要瞭解如下幾個知識點:
spa

  1. replace與正則約定的特殊標記符$
  2. 分組語法

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

  1. 這裏咱們採用的是 epx1(?=epx2)正向前瞻
  2. epx1對應的是正則符號是\d
    由於第一個逗號以前的數字範圍在1-3個之間,因此限定範圍 \d{1-3}
  3. 而後,exp2對應的是須要限定每3位數字添加一個,
    因此epx2的正則表達應該是:(\d{3}+$)(+:出現1次或屢次;$:限定以xxx結尾)
  4. 最後,replace()方法第二個參數:使用$&符號。
    $&,表示捕獲與正則表達式匹配的全文本並置換爲,
  5. 這樣寫來下就是'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 )

相關文章
相關標籤/搜索