一個案例
如何把一串整數轉換成千位分隔形式,例如10000000000,轉換成10,000,000,000。
在瞭解正規表示式之前,想要實現這個功能,無論程式碼量還是燒腦程度,都很令人抓狂,但若是運用正規表示式來解決的話,兩三行程式碼即可搞定!匹配、替換那些符合某種規則的字串,恰恰是正規表示式的強項。
正規表示式
#####概念 正規表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。它不僅僅是Javascript獨有的東西,絕大多數主流作業系統、主流開發語言、無數的應用軟體中,都可以看到正規表示式的優美舞姿。正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。 #####特點
- 靈活性、邏輯性、功能性非常強
- 可以迅速地用極簡單的方式達到字串的複雜控制。
- 對於剛接觸的人來說,比較晦澀難懂。
本文只是通過解決上述案例進而討論Javascript所支援的正規表示式的部分常用且重要的方法,想查詢Javascript中正規表示式的全部強大功能,請點選此處JavaScript RegExp 物件,檢視W3school官方文件。
梳理思路
要先明白的是,我們將要轉換成的數字格式是這樣:從個位往左數起,每三位前插入一個千位分隔符,
,即可以想象成我們要把每三位數字前面的那個空""
匹配出來,並替換成千位分隔符,
。每個千位分隔符後面的數字個數是3個或3的倍數個。
程式碼書寫
建立一個正規表示式字面量,並加上全域性匹配修飾符g。var reg = //g;
W3C對全域性匹配的解釋是:查詢所有匹配而非在找到第一個匹配後停止。
因為需要從右往左匹配,所以表示結尾的$
是必須要有的。三位數字用\d{3}
來表示,由於我們不知道究竟有多少組這樣的三位數字,所以需要在\d{3}
後面加上+
,來表示匹配任何包含至少一組三位數字的字串。至目前,/(\d{3})+$/g
表示作為結尾的3個或3的倍數個數字。
由於要替換的是每三位數(從末尾起)緊前面的那個""
,所以需要用到正向預查,即?=n
(匹配任何其後緊接指定字串 n 的字串)。正向預查咋用呢?這裡先舉個例子:有一個字串var str = "abaaaaa";
,我們想把後面跟著字元b的字元a表示出來,於是正規表示式寫法:var reg = /a(?=b)/g;
,匹配的是後面緊跟著字元b
的字元a
,字串str
中只有一個符合條件的a
,最後檢視匹配結果為["a"]。這個例子的程式碼如下:
var str = "abaaaaa",
reg = /a(?=b)/g;
console.log(str.match(reg));
複製程式碼
粗略瞭解正向預查之後,回到原來的案例,我們可以寫成/(?=(\d{3})+$)/g;
,為什麼(?=...)
前面什麼也不寫呀?因為我們要找的是那些後面緊跟著三位數字的""
呀,空當然什麼都不用寫了。
我們來檢驗一下,是不是匹配出來三個""
?
var str = "10000000000",
reg = /(?=(\d{3})+$)/g;
console.log(str.match(reg));
複製程式碼
結果如下,果然是三個""
。
var str = "10000000000",
reg = /(?=(\d{3})+$)/g;
console.log(str.replace(reg, ","));
複製程式碼
結果如下,轉換成功。
但是,還沒完…… 現在是十一位數字,如果再加一個0,湊夠十二位數呢,它可是3的倍數,我們試驗一下:
var str = "100000000000",
reg = /(?=(\d{3})+$)/g;
console.log(str.replace(reg, ","));
複製程式碼
結果變成了這樣:
這串數字最前面也被新增了一個,
。這個原因就不解釋了,你們應該明白為什麼。那麼怎麼解決呢?我們對程式碼進行一下完善,在\d
前面加一個非單詞邊界\B
,用來表示所匹配的這個空後面不能是一個單詞邊界,這樣就可以把最前面的這個,
去掉了。
最終的程式碼如下
var str = "100000000000",
reg = /(?=(\B\d{3})+$)/g;
console.log(str.replace(reg, ","));
複製程式碼
總結
綜上,”把一串整數轉換成千位分隔形式“這個案例就說完了。我再把這個案例用到的一些知識點梳理一下。
g
是表示全域性匹配的修飾符,全域性匹配指查詢所有匹配而非在找到第一個匹配後停止。$
是表示結尾的量詞,如n$
,匹配的是任何以n為結尾的字串。\d
是查詢數字的元字元。n{X}
是匹配包含 X 個 n 的序列的字串的量詞。n+
是匹配任何包含至少一個 n 的字串的量詞。?=n
正向預查,用於匹配任何其後緊接指定字串 n 的字串。match()
String物件的方法,作用是找到一個或多個正規表示式的匹配。replace()
String物件的方法,作用是替換與正規表示式匹配的子串。\B
是表示匹配非單詞邊界的元字元,與其互為補集的元字元是\b
,表示匹配單詞邊界。
本文無法做到十分細緻,如果看完還是一頭霧水的話,需要先從頭學一下正規表示式。 歡迎提出意見或建議,感謝你的閱讀!