2017年2月17日 星期五

正規表示法 - 幫數字字串的每三個位數標上逗號

碰到一個需求是將數字字串的每三個位數標上逗號,
例如:
1234567 ==> 1,234,456

發現原來正規表示法也可以辦到,特別在這邊做個紀錄。

以Javascript為例,以下的方法numberWithCommas()可以將輸入的整數字串每隔3位數標上逗號

function numberWithCommas(x) {
  return x.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

使用的正規表示法為
\B(?=(\d{3})+(?!\d))

先來看看它的圖型化表示

圖型化表示連結


解釋:
我們要匹配的是從低位數數起,每三個位數的位置(是位置,不是字元),但不包括左邊沒數字的位置
例如123456789,匹配的位置有
3跟4這間、6跟7中間,但1左邊不應該要有。



\B   :   非字元邊界,在此列中即左邊不應該有空白

x(?=y)   :   x接著y才匹配成功,並且y不列入匹配成功的字串中,只匹配出x,如果x沒寫,則 匹配出來的為位置

\d{3}  :   3個數字字元

x(?!y)   :   x後面不跟著y才匹配成功

所以組合出來的就是

  1. 左邊不要空格(即不要左邊界) ==>  \B
  2. 比對後面符合我們要的條件的位置  ==> \B(?=)
  3. 條件之一,1到多個的,3個為一組的數字字元  ==>  \B(?=(\d{3})+)
  4. 條件之二,條件之一的最後面不可是數字字元  ==>  \B(?=(\d{3})+(?!\d))
最後,找到位置以後,把位置替換成逗號就行了。



沒有留言 :

張貼留言