我正在尝试使用正则表达式格式化一些电话号码。我存储的电话号码长度不同,所有电话号码都有国家代码。假设一个数字如下所示:00460708186681。我希望将其格式化为:+46 (0)708-18 66 81。前三组很简单:
/00([\d]{2})([\d]{1})([\d]{3})/
因为数字的开头总是相同的。这是我不知道剩余字符长度的最后一部分(我希望将它们分成两组)。
我正在尝试使用正则表达式格式化一些电话号码。我存储的电话号码长度不同,所有电话号码都有国家代码。假设一个数字如下所示:00460708186681。我希望将其格式化为:+46 (0)708-18 66 81。前三组很简单:
/00([\d]{2})([\d]{1})([\d]{3})/
因为数字的开头总是相同的。这是我不知道剩余字符长度的最后一部分(我希望将它们分成两组)。
从以下正则表达式开始作为您的基础:
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.
要匹配字符串,您可以在最后一组中手动添加空格,该组将包含初始格式化后的所有数字。
正则表达式不是这里的最佳解决方案。用这个:
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;
这将适用于无限长的数字。正则表达式无法做到这一点。
这是解决方案:
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/上尝试上面的脚本
下面是一个用 TypeScript 编写的代码示例,但您肯定可以将其解析为 JavaScript:
const formatPhoneNumber = (phoneNumber: number, format?: string, code?: boolean): string => {
let _format = format === undefined ? '--- --- ---' : format
let x = 1
const newFormat = _format.replace(/-+/g, () => '$' + x++)
let regex = '^'
_format.match(/-+/g)?.forEach((c, k) => {
regex += `(\\d{${c.length}})?`
})
return (code !== undefined && code === true ? '+' : '') + (phoneNumber.toString().concat(_format.split(' ').join(''))).slice(0, _format.split(' ').join('').length).toString().replace(new RegExp(regex, 'g'), newFormat)}
要对其进行测试,您可以执行以下操作:
const formatedPhoneNumber = formatPhoneNumber(600000000) // => 600 000 000
const formatedPhoneNumberWithCountryCode = formatPhoneNumber(237600000000, 'xxx xxx xxx xxx', true) // => +237 600 000 000
这个例子是完全模块化的,所以你可以指定你自己的格式(模板)来获得不同的输出!
注意:我是喀麦隆人,所以我使用了那个奇怪的模板,请随意调整模板以适应所需的电话号码模板