javascript最短的正则表达式格式化帐号

时间:2012-03-22 11:09:18

标签: javascript regex

问题: 在我的数据库中,我保留了一些帐号:

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');

但我认为这是一种天真的解决方案,这个代码可以重构以避免重复。任何人都可以做到这一点吗?

4 个答案:

答案 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"