问题: 在我的数据库中,我保留了一些帐号:
PL83102044760000870200961284
现在我必须像这样格式化:
PL 83 1020 4476 0000 8702 0096 1284
我编写了简单的js正则表达式来完成这项工作:
account.replace(/(\w{2})(\d{2})(\d{4})(\d{4})(\d{4})(\d{4})(\d{4})(\d{4})/g, '$1 $2 $3 $4 $5 $6 $7 $8');
但我认为这是一种天真的解决方案,这个代码可以重构以避免重复。任何人都可以做到这一点吗?
答案 0 :(得分:2)
像
这样的东西"PL83102044760000870200961284".match(/.{4}/g).join(" ")
可能?
没有注意到“PL 83”的第一个要求
account.match(/.{4}/g).map(function(n){ return /([A-Z]{2})(\d{2})/.test(n) ? RegExp.$1 + " " + RegExp.$2 : n; }).join(" ");
说实话,我会想要手动修复第一位而不是地图,或者我确定有聪明的方法来使用匹配来做两个......
这也有效
account.match(/[A-Z]{2}|(?:(?:\d{2}|\d{4})(?=(\d{4})*$))/g).join(" ")
答案 1 :(得分:1)
哦,男孩,再一次正则表达时根本不需要。
function getFormattedAccountNo( accountNo ){
var formattedAccountNo = '';
for ( var i = 0; i < accountNo.length; i++ ){
if ( formattedAccountNo.length == 2 || formattedAccountNo.length % 4 == 0 ){
formattedAccountNo += ' ';
}
formattedAccountNo += accountNo.charAt(i);
}
return formattedAccountNo;
}
答案 2 :(得分:0)
这个解决方案可能有点棘手:
"PL83102044760000870200961284".replace(/^(\w{2})(\d{2})(\d{24})$/, function(_, a, b, c) {
return [a, b, c.replace(/(\d{4})/g, '$1 ')].join(" ");
});
答案 3 :(得分:0)
这不是最好看的解决方案,但我同意scibuff:在这种情况下正则表达式不是......这是一个简单的1行解决方案:
var str = 'PL83102044760000870200961284';
var formatted = str.substr(0,2)+' '+str.substr(2,2)+' '+str.substr(4,4)+' '+str.substr(8,4)+' '+str.substr(12,4)+' '+str.substr(16,4)+' '+str.substr(20,4)+' '+str.substr(24);
控制台输出:"PL 83 1020 4476 0000 8702 0096 1284"
。