我正在尝试将电话号码格式化为更整洁的格式,在前面的每第三个和第七个字符之间添加一个空格。
var string = "02076861111"
var phone = [string.slice(0, 3), " ", string.slice(3)].join('');
console.log(phone);
我应该把第七个字符的方法放在哪里,以便返回
020 7686 1111
?
任何帮助表示赞赏。提前致谢!
在单个替换中:
var string = "02076861111"
var phone = string.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3');
console.log(phone);
当然,假设你总是有一个完美的字符串(没有空格,连字符或其他字符,10 个字符......)
更严格的正则表达式可能是这样的:
var phone = string.replace(/\D*(\d{3})\D*(\d{4})\D*(\d{4})\D*/, '$1 $2 $3');
但是,这并不能抓住所有的可能性。
再切一遍:
var string = "02076861111";
var phone = [string.slice(0, 3), " ", string.slice(3,7), " ", string.slice(7)].join('');
console.log(phone);
Slice 采用开始和(独占)结束索引。请注意,如果缺少结束索引,它将占用字符串的其余部分。
所以第一个切片采用索引 0 到 2,第二个切片采用索引 3 到 6,最后一个切片采用索引 7 到字符串的末尾。
替代解决方案:
function numberWithSpaces(value, pattern) {
var i = 0,
phone = value.toString();
return pattern.replace(/#/g, _ => phone[i++]);
}
console.log(numberWithSpaces('02076861111', '### #### ####'));
当正则表达式可以工作时,为什么要使用 slice
console.log( "02076861111".replace(/(\d{3})\D?(\d{4})\D?(\d{4})/,"$1 $2 $3") );
如果用户进入空格开始,这不会爆炸。
您必须考虑只有 11、12 和 13 个字符的号码才有效,您必须知道一个有效的电话号码由国家代码和 10 位数字组成。因此我想按国家代码格式化电话号码,然后是一些任意组,比如 +1 555 555 5555、+22 555 555 555 或 +333 555 555 5555。
因此我想要一个过滤数字并格式化它们的函数:
export const formatPhone = (phone: string) => {
const myPhone = phone.match(/(\d)/g)?.join(``);
if (myPhone === undefined) return ``;
if (myPhone?.length === 11) {
return myPhone.replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, `+$1 $2 $3 $4`);
}
if (myPhone?.length === 12) {
return myPhone.replace(/(\d{2})(\d{3})(\d{3})(\d{4})/, `+$1 $2 $3 $4`);
}
if (myPhone?.length === 13) {
return myPhone.replace(/(\d{3})(\d{3})(\d{3})(\d{4})/, `+$1 $2 $3 $4`);
}
return myPhone;
};
如果你想要一个函数来验证一个数字,它会是这样的
export const validatePhone = (myPhone: string) => {
if (myPhone === ``) return ``;
const phone = myPhone.match(/(\d)/g)?.join(``);
if (phone === undefined) return `only numbers are valid`;
if (phone?.length > 13 || phone?.length < 11)
return `${phone} is not a valid number`;
};
console.log( "02076861111".replace(/^\d{3}-\d{8}$/) );