2012-07-17 165 views
1

我试图格式化一些电话号码与正则表达式。我存储的电话号码的长度不一,所有电话号码都有他们的国家代码。比方说,一些看起来像这样:00460708186681.我想一个被格式化为:+46(0)708-18 66 81前3组很简单:电话号码格式javascript

/00([\d]{2})([\d]{1})([\d]{3})/ 

由于号码的开头将永远是一样的。这是我不知道剩余字符长度的最后部分(我希望它们被分成两组)。

+5

你为什么用正则表达式这样做呢?这不是这份工作的正确工具,即使它可以做到。它会更快,并且可能更简单的使用固定的子字符串。 – Ariel 2012-07-17 09:39:14

回答

1

开始用下面的正则表达式为你的基地:

00(\d{2})(\d)(\d{3})(\d{2}) 

现在添加一个对(\d{2})?(注意“?”),每对有可能有。因此,如果对的最大数量为3,则执行以下操作:

00(\d{2})(\d)(\d{3})(\d{2})(\d{2})?(\d{2})? 

它不漂亮,但你需要做的,以便办法让他们正确地进行分组。或者你可以简单地做:

00(\d{2})(\d)(\d{3})((?:\d{2}){2,4}) // In this case it's 2 to 4 pairs of digits on the end. 

要匹配的字符串,那么你可以手动添加空间,这将包含您最初格式化后的全部位的最后一个小组。

1

正则表达式不是这里最好的解决方案。使用这个:

var num = new String("00460708186681"), 
    i = 2, 
    p, 
    res = "+"+num.substr(i,2)+" ("+num.charAt(i+=2)+")"+num.substr(++i,3)+"-"+num.substr(i+=3,2); 
while (p=num.substr(i+=2,2)) 
    res+= "\u00A0"+p; 
return res; 

这将工作无限长的数字。正则表达式不能这样做。

+0

他正在处理电话号码。它们的长度可能不一样,但肯定有一个众所周知的最大值(它不是很大)。 – Thor84no 2012-07-17 15:26:01

0

这里是解决方案:

的Javascript:

var num="00460708186681"; 
var res=num.replace(/([0+]{2})([1-9]{2})([\d]{1})([\d]{3})([\d]{2})([\d]{2})([\d]{2})/g,'+$2($3)-$4 $5 $6 $7'); 
alert(res); 

尝试上面的脚本上http://codebins.com/

+0

'[0 +] {2}'允许任意数量的0(1或_more_ 0s,两次)。第二部分'[1-9] {2}'不会匹配'0010',例如应该被认为是有效的,您可以使用'[1-9] [0-9]'代替。另外,不需要在'[]'里面放置单个值(你用'0 +'和所有'\ d's来完成),因为这是一个正则表达式中的OR。 – Thor84no 2012-07-17 15:17:17