有没有办法以更高效(更清洁)的方式执行以下操作?
function phoneFormat(number){
var noSpace = number.split(" ").join("");
var noSpace = noSpace.replace(/-/g, "");
return noSpace.replace(/./g, "");
}
更改此编号后,我想将其重新格式化为(ddd)ddd-dddd。我正在考虑使用split和push来做这件事,但有更聪明的方法吗?
答案 0 :(得分:3)
在正则表达式中使用字符类:
return number.replace(/[- .]/g, "");
那就是说“用空字符串替换字符串中的所有-
,空格和.
字符。” []
表示该类,表示“任何这些字符”。请注意,我将-
放在它的开头;如果它不是在开头或结尾,你必须用反斜杠来逃避它,否则它会在类中引入一个范围字符(例如,A-Z
是所有大写英文字母)。但是当它是第一件事(就在[
之后)或最后一件事(就在]
之前)时,它并不特别。另请注意,虽然.
在正则表达式中通常是特殊的(意思是“此处的任何字符”),但它在字符类中并不特殊。
重新评论:
你知道是否有一种聪明的方法可以将它重新格式化为(ddd)ddd-ddd?
你在问题中说(ddd) ddd-dddd
,所以我假设最后有四个而不是三个(例如,你在美国,加拿大或美洲的许多其他地方):< / p>
如果x
有"1234567890"
,那么x.replace(/^(\d{3})(\d{3})(\d{4})$/, '($1) $2-$3')
将返回"(123) 456-7890"
。 (...)
是捕获组,替换字符串中的$1
等是放置捕获文本的位置。
所以:
return number.replace(/[- .]/g, "").replace(/^(\d{3})(\d{3})(\d{4})$/, '($1) $2-$3');
\d
表示“数字”(0-9),{3}
表示“之前正好有三个”,因此\d{3}
表示“三位数”(和当然,\d{4}
表示“正好四位数”)。 ^
和$
“断言”输入的开头和结尾。
答案 1 :(得分:1)
排除任何非数字的内容然后使用仅数字字符串执行最终格式化可能更有用:
function phoneFormat(input) {
return input.replace(/\D/g, '')
.replace(/(...)(...)(....)/, '($1) $2-$3');
}
console.log(phoneFormat('123/45.67.890'));
输出:
(123)456-7890
\D
必须是大写字母,并且匹配任何不是数字的内容。
第二个正则表达式中的点匹配任何字符,但此时我们已经知道它们都是数字。使用三个捕获组,我们可以使用它们的后向引用来进行最终格式化。
上述功能的缺点是它只返回数字,即使输入不代表电话号码。如果这是一个问题,那么你可以选择这个变种:
function phoneFormat(input) {
var digits = input.replace(/\D/g, '');
if (digits.length !== 10) return input; // not valid: return original
return digits.replace(/(...)(...)(....)/, '($1) $2-$3');
}
如果原始输入中只有10个数字,则只会返回格式化字符串。
答案 2 :(得分:0)
使用此
function phoneFormat(number){
return number.replace(/-|\.|\s/g,'').replace(/(\d{3})(\d{3})(\d{3})/g,'($1) $2-$3');
}