有没有可能使用正则表达式进行数字分组(例如,将数字1000
转换为字符串"1 000"
),并且只需要一次扫描?(我知道某些系统中正则表达式和语言工具之间的界限有些模糊 - 回答前请听从您的良心。)
我提问的原因:最近另一个开发人员问我如何在JavaScript中执行数字分组,并向我展示了一个略有错误的JavaScript函数,其中使用了正则表达式。我给了他更好的替代方案,但他的正则表达式让我感到困扰,因为这种重写明显是正则文法应该能够完成的事情,但我确实不知道该如何编写正则表示式。
这是我的第一个天真的尝试,我知道它是不正确的:
function group(n) { return n.toString().replace(/(\d{3})/g, "$1 "); }
这种方法有两个缺点:group(1000)会生成"100 0",而group(100)会生成"100 "(末尾有空格)。您可以通过以下方式进行修复:
String.prototype.reverse = function () {
var a = [];
for (var i = this.length; i >= 0; --i) a.push(this[i]);
return a.join("");
};
function group(n) {
return n.toString().reverse().replace(/(\d{3})/g, "$1 ").
trimRight().reverse();
}
但是这需要不止一个、两个、甚至三个,而是四个步骤(两个反转,一个替换和
trimRight
)!然后我冒险进入了回顾领域,并想出了以下解决方案:function group(n) { return n.toString().replace(/(\d{3}(?!\d))/g, " $1");
...这根本不起作用(编辑-可能是因为我混淆了后顾和负面的前瞻...)- 它只匹配最后三位数(group(1000000000)
变成 "1000000 000"
)。前瞻效果稍微好一些:
function group(n) { return n.toString().replace(/(\d{3})(?=\d)/g, "$1 "); }
这更或多或少地让我回到了起点 - 我已经摆脱了尾随的空格,但是
group(1000)
仍然产生"100 0"
。那么,能否通过单个正则表达式替换来完成此操作?我不关心使用哪种编程语言,因为这只需要使用正则表达式功能即可。
注意:这不是关于如何进行本地化的问题,我也不会进行过早的优化。我只是好奇是否可能,如果不可能,为什么不可能。