用 Javascript 重新格式化美国电话号码的正则表达式

IT技术 javascript regex
2021-03-13 00:20:37

我正在寻找重新格式化(替换,而不是验证 - 有很多验证参考)要在 Javascript 中显示的电话号码。以下是一些数据的示例:

  • 123 4567890
  • (123) 456-7890
  • (123)456-7890
  • 123 456 7890
  • 123.456.7890
  • (空白/空)
  • 1234567890

有没有一种简单的方法可以使用正则表达式来做到这一点?我正在寻找最好的方法来做到这一点。有没有更好的办法?

我想将数字重新格式化为以下内容: (123) 456-7890

6个回答

假设您想要格式“ (123) 456-7890”:

function formatPhoneNumber(phoneNumberString) {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '');
  var match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/);
  if (match) {
    return '(' + match[1] + ') ' + match[2] + '-' + match[3];
  }
  return null;
}

这是一个允许可选+1国际代码的版本

function formatPhoneNumber(phoneNumberString) {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '');
  var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/);
  if (match) {
    var intlCode = (match[1] ? '+1 ' : '');
    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('');
  }
  return null;
}
formatPhoneNumber('+12345678900') // => "+1 (234) 567-8900"
formatPhoneNumber('2345678900')   // => "(234) 567-8900"
@AdamZerner 是真的,但其他国家/地区的电话号码并非都是十位数字,因此此处的格式不适用于国际。
2021-04-19 00:20:37
完美的; 谢谢!但是,我在添加此功能后更改return (!m) ? nullreturn (!m) ? ""
2021-04-28 00:20:37
仅供参考,这不适用于 +1555-555-5555 之类的数字
2021-04-29 00:20:37
'' + phoneNumberStringphoneNumberString...相同,它已经是一个字符串。
2021-05-14 00:20:37
关于如何解决问题的一个很好的教训。我试图思考如何匹配所有可能的情况——你消除不相关的,看看是否有匹配。非常好。
2021-05-15 00:20:37

可能的解决方案:

function normalize(phone) {
    //normalize string and remove all unnecessary characters
    phone = phone.replace(/[^\d]/g, "");

    //check if number length equals to 10
    if (phone.length == 10) {
        //reformat and return phone number
        return phone.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
    }

    return null;
}

var phone = '(123)4567890';
phone = normalize(phone); //(123) 456-7890

var x = '301.474.4062';
    
x = x.replace(/\D+/g, '')
     .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');

alert(x);

谢谢!这正是我需要的
2021-04-27 00:20:37
谢谢肖恩,我喜欢你简短的内联解决方案。
2021-05-10 00:20:37
谢谢你!例如,我将其更改x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');为在电话号码前添加“+1”
2021-05-13 00:20:37

这个答案借用了 maerics 的答案。它的主要区别在于它接受部分输入的电话号码并格式化已输入的部分。

phone = value.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
if (match) {
  phone = `${match[1]}${match[2] ? ' ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}`;
}
return phone
在我的反应代码中,我通过在内部仅存储输入的数字然后格式化放置在字段中的内容来解决这个问题。因此退格键会删除实际值中的前一个字符,而不是显示值。
2021-04-17 00:20:37
实际上问题是你不能在'-'或中间字符串的空格上退格。您需要防止在用户退格时重新格式化(例如,newstring.length < oldstring.length或跟踪光标位置并确定用户何时刚刚退格了这些分隔符,例如if (cursorPosition === 4 && numericString.length > 3)
2021-04-22 00:20:37
如果有帮助,我在区号周围添加了括号: (${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
2021-05-03 00:20:37
这在您键入时起作用,从源海报添加所需的格式。经过 1.5 小时的搜索,我很高兴我尝试了这个!
2021-05-04 00:20:37

我正在使用此函数来格式化美国数字。

function formatUsPhone(phone) {

    var phoneTest = new RegExp(/^((\+1)|1)? ?\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})( ?(ext\.? ?|x)(\d*))?$/);

    phone = phone.trim();
    var results = phoneTest.exec(phone);
    if (results !== null && results.length > 8) {

        return "(" + results[3] + ") " + results[4] + "-" + results[5] + (typeof results[8] !== "undefined" ? " x" + results[8] : "");

    }
    else {
         return phone;
    }
}

它接受几乎所有可以想象的写美国电话号码的方式。结果被格式化为 (987) 654-3210 x123 的标准格式