Javascript 使用替换点的变量创建正则表达式模式
我需要替换字符串中的小数分隔符,小数分隔符可以是点Javascript 使用替换点的变量创建正则表达式模式,javascript,regex,replace,Javascript,Regex,Replace,我需要替换字符串中的小数分隔符,小数分隔符可以是点(例如英语)或逗号,(例如德语)。因此,我使用变量sep来包含分隔符字符串 为了转换基于英语的十进制分隔符,我做了以下替换,但得到的是,dd,dd,而不是120,dd: var sep='; var numberStr='120.31'; numberStr=numberStr.replace(新的RegExp(sep+'\\d{2}','g','dd'); 控制台日志(numberStr)您需要通过在分隔符前面加上\字符来转义分隔符(以便Re
(例如英语)或逗号,
(例如德语)。因此,我使用变量sep
来包含分隔符字符串
为了转换基于英语的十进制分隔符,我做了以下替换,但得到的是,dd,dd
,而不是120,dd
:
var sep=';
var numberStr='120.31';
numberStr=numberStr.replace(新的RegExp(sep+'\\d{2}','g','dd');
控制台日志(numberStr)代码>您需要通过在分隔符前面加上\
字符来转义分隔符(以便RegExp引擎按原样处理它):
var escapedSep = sep.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
numberStr = numberStr.replace(new RegExp(escapedSep + '\\d{2}', 'g'), ',dd');
否则,
将被视为RegExp元字符,匹配任何符号(换行符除外)。您需要通过在分隔符前面加上\
字符来转义分隔符(以便RegExp引擎按原样处理它):
var escapedSep = sep.replace(/[.?*+^$[\]\\(){}|-]/g, "\\$&");
numberStr = numberStr.replace(new RegExp(escapedSep + '\\d{2}', 'g'), ',dd');
否则,
将被视为RegExp元字符,与任何符号匹配(换行除外)。正则表达式中的点字符与单个字符匹配,而与实际字符本身无关(详细信息取决于使用的编程语言/regex引擎/标志)
如果要匹配点,分隔符应转义正则表达式点选择器字符,如var sep='\\'代码>以匹配实际点,而不是“任何单个字符”
因此,出现错误是因为在120.31
中,模式[任何字符后跟2个数字]
被查找/替换了两次,一次用于120
,一次用于.31
,因为1
以及
匹配正则表达式点选择器。
有关详细信息,请参见正则表达式中的点字符与单个字符匹配,而不考虑实际字符本身(详细信息取决于使用的编程语言/正则表达式引擎/标志)
如果要匹配点,分隔符应转义正则表达式点选择器字符,如var sep='\\'代码>以匹配实际点,而不是“任何单个字符”
因此,出现错误是因为在120.31
中,模式[任何字符后跟2个数字]
被查找/替换了两次,一次用于120
,一次用于.31
,因为1
以及
匹配正则表达式点选择器。
有关详细信息,请参见,以澄清此。。。(我还没来得及回答,他就回答了),正则表达式以\d{2}
结尾,这意味着点匹配所有内容。若要转义点,必须添加\\
,以便显示点,而不是“匹配除换行符以外的所有内容”。但我应该看看basst314的答案。原因:那些额外的正则表达式。这是不必要的。如果你检查我的原始答案,你会发现那是第一个版本。但是你认为OP改变一个分隔符会发生什么呢?为了澄清这一点。。。(我还没来得及回答,他就回答了),正则表达式以\d{2}
结尾,这意味着点匹配所有内容。若要转义点,必须添加\\
,以便显示点,而不是“匹配除换行符以外的所有内容”。但我应该看看basst314的答案。原因:那些额外的正则表达式。这是不必要的。如果你检查我的原始答案,你会发现那是第一个版本。但你认为OP改变分隔符会发生什么?