2017-09-08 63 views
0

我需要替換字符串中的小數點分隔符,並且小數點分隔符可以是點號.(例如英文)或逗號,(例如德語)。所以我有用於包含分隔符字符串的變量sep用替換點的變量創建正則表達式

要轉換的英語基礎的小數點分隔符,我做了以下的替代品,但我得到了,dd,dd而不是120,dd

var sep = '.'; 
 
var numberStr = '120.31'; 
 
numberStr = numberStr.replace(new RegExp(sep + '\\d{2}', 'g'), ',dd'); 
 
console.log(numberStr);

有誰知道我在哪裏出了錯?

回答

3

無論實際字符本身如何(細節取決於使用的編程語言/正則表達式引擎/標誌),RegularExpressions中的點字符都匹配一個單個字符。

如果你想比賽點,您應該分隔逃脫正則表達式點選擇字符像var sep = '\\.';匹配實際點,而不是「任何單個字符」。

因爲120.31模式[any character followed by 2 numbers]發現/更換兩次,一次爲120,一次用於.31,爲1藏漢爲.匹配正則表達式點選擇'.'所以出現你的錯誤。

詳情參見Regex Cheat Sheet

1

你需要躲避分離器與\字符前綴它(這樣它會通過正則表達式引擎是對待):

var escapedSep = sep.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&"); 
numberStr = numberStr.replace(new RegExp(escapedSep + '\\d{2}', 'g'), ',dd'); 

否則.被視爲正則表達式元字符,在任何匹配符號(換行符除外)。

+0

要澄清一下...(他回答之前,我可以做),正則表達式結束的'\ d {2}'這意味着該點匹配的一切。爲了避開這個點,你必須添加'\\',以便提供一個點,而不是「匹配除換行符之外的所有內容」。但我應該看看basst314的答案。原因:那些額外的正則表達式。這是不需要的。 – KarelG

+0

如果你檢查我的原始答案,你會發現這是第一個版本。但是你認爲OP在改變分隔符時會發生什麼? – raina77ow