【问题标题】:Creating a regex pattern with a variable for replacing a dot使用用于替换点的变量创建正则表达式模式
【发布时间】:2017-09-08 14:46:43
【问题描述】:

我需要替换字符串中的小数点分隔符,小数点分隔符可以是点.(例如英语)或逗号,(例如德语)。所以我有变量sep 用于包含分隔符字符串。

为了转换基于英文的小数点分隔符,我做了以下替换,但我得到了,dd,dd 而不是120,dd

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

有人知道我哪里出错了吗?

【问题讨论】:

    标签: javascript regex replace


    【解决方案1】:

    RegularExpressions 中的点字符匹配单个字符,而与实际字符本身无关(详细信息取决于所使用的编程语言/正则表达式引擎/标志)。

    如果你想匹配一个点,你的分隔符应该转义正则表达式点选择器字符,比如var sep = '\\.';,以匹配一个实际的点,而不是“任何单个字符”。

    所以您的错误发生是因为在120.31 中,模式[any character followed by 2 numbers] 被发现/替换了两次,一次用于120,一次用于.31,因为1 以及. 匹配正则表达式点选择器'.'.

    详情见Regex Cheat Sheet

    【讨论】:

      【解决方案2】:

      您需要通过在其前面加上 \ 字符来转义分隔符(以便 RegExp 引擎按原样处理它):

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

      否则 . 被视为 RegExp 元字符,匹配任何符号(换行符除外)。

      【讨论】:

      • 为了澄清这个......(他在我做之前回答了),正则表达式以.\d{2}结束,这意味着点匹配所有内容。要转义点,您必须添加 \\ 以便显示一个点,而不是“匹配除换行符之外的所有内容”。但我应该看看 basst314 的回答。原因:那些额外的正则表达式。这是不必要的。
      • 如果您查看我的原始答案,您会发现这是第一个版本。但是你有没有想过当 OP 改变分隔符时会发生什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2017-08-01
      • 2016-01-21
      • 2013-05-12
      相关资源
      最近更新 更多