这是SO question的扩展
我做了一个函数来看看我是否可以正确格式化任何数字。下面的答案适用于 https://regex101.com 和 https://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})$/
,让我们一步一步来看看发生了什么。
^\d{1,13}
确实匹配字符串的开头0
(\.
现在您已经打开了一个新组,并且它与.
匹配
\d{1,2}
它确实找到了数字1
和2
|\d{0,2}
所以这部分被跳过)
所以这是捕获组的结尾。$
这表示字符串的结尾,但它不会匹配,因为仍然有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/