1 回答

TA貢獻1775條經驗 獲得超8個贊
"123456789".replace(/(\d{3})(?:[^$])/g, "$1,");
()
表示捕獲型括號,(?:)
表示非捕獲型括號,所以第一個括號匹配的內容會放在$1中,第二個括號匹配的內容不會放在$2
中。\d{3}
表示連續三個數字,[^$]
表示匹配一個字符,只要這個字符不是$符號,需要注意的是[]
表示匹配里面的任意一個字符,但是肯定是要有一個的,所以[]
匹配出來的字符的長度肯定是1,不存在0的情況,另外在[$]
里面的符號是沒有特殊含義的,就是 這個字符,而不是匹配字符串的結尾。
因為\d{3}
匹配三個字符,[^$]
匹配一個字符,所以這個正則匹配4個字符;來看匹配過程,首先"1234"是滿足的,"123"匹配\d{3}
,"4"匹配[^$]
,此時$1="123"
,所以"1234"被替換成"123,"。然后從5開始下次匹配,類似的"5678"滿足條件,$1="567"
,所以"5678"被替換成"567,"。然后從9開始匹配,下面沒有匹配了,匹配結束,結果為"123,567,9"。"1234567".replace(/\B(?:(\d{3})+(?!\d))/g, ",");
\B
匹配非單詞邊界,也是一個位置,沒有寬度,(\d{3})+
匹配3的倍數數字序列,且個數至少是3個,+
是量詞,表示1到多次,默認是貪婪的,貪婪就是盡可能多的匹配,(?!d)表示這個位置后面不是數字。
看例子,首先\B
不匹配行首,所以匹配的位置移動到"1"后面的位置,此時\B
匹配1后面的位置,然后"234", "567"匹配d{3},因為是貪婪匹配,所以(d{3})+匹配"234567",然后因為7后面是字符串的結尾了,所以滿足斷言(?!\d)
不是數字,所以整個正則的匹配結果是"234567",所以"234567"被替換成了","
。1不動,所以"1234567"變成了"1,"。"123456789".replace(/(\d{3})(?=[^$])/g, "$1,");
這個正則表達式不滿足"千分位添加逗號"的需求,"123456789"只是個特例(位數正好是3的倍數),換成"12345678"結果是"123,456,78"。
添加回答
舉報