javascript - 使用某些正则表达式模式时,为什么我的函数不能正确替换

标签 javascript regex replace regex-negation regex-group

这是SO question的扩展

我做了一个函数来看看我是否可以正确格式化任何数字。下面的答案适用于 https://regex101.comhttps://regexr.com/ 等工具,但不适用于我的函数(在节点和浏览器中尝试过): 常量

const format = (num, regex) => String(num).replace(regex, '$1')

基本上给定任何整数,其有效数字不应超过 15 位。给定任何小数,不得超过小数点后 2 位。

所以... 现在

format(0.12345678901234567890, /^\d{1,13}(\.\d{1,2}|\d{0,2})$/)

返回 0.123456789012345678 而不是 0.123456789012345

但是

format(0.123456789012345,/^-?(\d*\.?\d{0,2}).*/)

按预期返回格式化为 2 个小数点的数字。

最佳答案

让我尝试解释一下发生了什么。

对于给定的输入 0.12345678901234567890 和正则表达式 /^\d{1,13}(\.\d{1,2}|\d{0,2})$/,让我们一步一步来看看发生了什么。

  1. ^\d{1,13} 确实匹配字符串的开头 0
  2. (\. 现在您已经打开了一个新组,并且它与 .
  3. 匹配
  4. \d{1,2} 它确实找到了数字 12
  5. |\d{0,2} 所以这部分被跳过
  6. ) 所以这是捕获组的结尾。
  7. $ 这表示字符串的结尾,但它不会匹配,因为仍然有 345678901234567890 剩余。

Javascript 返回整个字符串,因为最终匹配失败。

让我们尝试删除末尾的 $ ,将其变为 /^\d{1,13}(\.\d{1,2}|\d{0,2} )/

您会返回“.12345678901234567890”。这产生了几个问题。

为什么前面的0被删除了?

因为它不属于您的匹配组的一部分,用 () 括起来。

为什么我们不只得到两位小数,即.12

请记住,您正在执行替换。这意味着默认情况下,原始字符串将保留在适当的位置,只有匹配的部分才会被替换。由于 345678901234567890 不是比赛的一部分,因此它保持原样。唯一匹配的部分是 0.12

关于javascript - 使用某些正则表达式模式时,为什么我的函数不能正确替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894174/

相关文章:

java - 根据正则表达式将字符添加到字符串的特定位置

用于在查询中进行多次替换的 mysql 存储函数

javascript - jQuery Ajax 成功函数返回空值?

javascript - 无法使用 Internet Explorer 11 登录 Firebase

python - 如何使用正则表达式匹配软件版本

regex - 以任意顺序匹配多个组,中间有未知文本

Java 正则表达式;团体条件

javascript - 如何在此 jQuery 滚动脚本中使滚动速度变慢?

javascript - Node.js:在二进制数组上迭代哪个命令

python-3.x - Dataframe 融化并保留索引