regex - Reguljärt uttryck för att omformatera ett amerikanskt telefonnummer i Javascript


Jag letar efter att omformatera (ersätta, inte validera - det finns många referenser för att validera) ett telefonnummer för visning i Javascript. Här är ett exempel på några av uppgifterna:

  • 123 4567890
  • (123) 456-7890
  • (123)456-7890
  • 123 456 7890
  • 123.456.7890
  • (tom/null)
  • 1234567890

Finns det ett enkelt sätt att använda ett reguljärt uttryck för att göra detta? Jag letar efter det bästa sättet att göra detta. Finns det ett bättre sätt?

Jag vill formatera om numret till följande: (123) 456-7890

Svar #1

Förutsatt att du vill ha formatet "(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;
}

Här är en version som tillåter den valfria +1 internationella koden:

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"

Svar #2

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

alert(x);

Svar #3

Möjlig lösning:

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

Svar #4

Detta svar lånar från maerics svar. Det skiljer sig främst åt genom att det accepterar delvis angivna telefonnummer och formaterar de delar som har angetts.

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

Relaterade artiklar