Regular Expression to reformat a US phone number in Javascript

后端 未结 13 2146
眼角桃花
眼角桃花 2020-12-02 07:32

I\'m looking to reformat (replace, not validate - there are many references for validating) a phone number for display in Javascript. Here\'s an example of some of the data:

相关标签:
13条回答
  • 2020-12-02 08:16

    Here is one that will accept both phone numbers and phone numbers with extensions.

    function phoneNumber(tel) {
    var toString = String(tel),
        phoneNumber = toString.replace(/[^0-9]/g, ""),
        countArrayStr = phoneNumber.split(""),
        numberVar = countArrayStr.length,
        closeStr = countArrayStr.join("");
    if (numberVar == 10) {
        var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed.
    } else if (numberVar > 10) {
        var howMany = closeStr.length,
            subtract = (10 - howMany),
            phoneBeginning = closeStr.slice(0, subtract),
            phoneExtention = closeStr.slice(subtract),
            disX = "x", // Change the extension symbol here
            phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed. 
            array = [phoneBeginningReplace, disX, phoneExtention],
            afterarray = array.splice(1, 0, " "),
            phone = array.join("");
    
    } else {
        var phone = "invalid number US number";
    }
    return phone;
    }
    
    phoneNumber("1234567891"); // Your phone number here
    
    0 讨论(0)
  • 2020-12-02 08:19

    I'm using this function to format US numbers.

    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;
        }
    }
    

    It accepts almost all imaginable ways of writing a US phone number. The result is formatted to a standard form of (987) 654-3210 x123

    0 讨论(0)
  • 2020-12-02 08:21

    The solutions above are superior, especially if using Java, and encountering more numbers with more than 10 digits such as the international code prefix or additional extension numbers. This solution is basic (I'm a beginner in the regex world) and designed with US Phone numbers in mind and is only useful for strings with just 10 numbers with perhaps some formatting characters, or perhaps no formatting characters at all (just 10 numbers). As such I would recomend this solution only for semi-automatic applications. I Personally prefer to store numbers as just 10 numbers without formatting characters, but also want to be able to convert or clean phone numbers to the standard format normal people and apps/phones will recognize instantly at will.

    I came across this post looking for something I could use with a text cleaner app that has PCRE Regex capabilities (but no java functions). I will post this here for people who could use a simple pure Regex solution that could work in a variety of text editors, cleaners, expanders, or even some clipboard managers. I personally use Sublime and TextSoap. This solution was made for Text Soap as it lives in the menu bar and provides a drop-down menu where you can trigger text manipulation actions on what is selected by the cursor or what's in the clipboard.

    My approach is essentially two substitution/search and replace regexes. Each substitution search and replace involves two regexes, one for search and one for replace.

    Substitution/ Search & Replace #1

    • The first substitution/ search & replace strips non-numeric numbers from an otherwise 10-digit number to a 10-digit string.

    First Substitution/ Search Regex: \D

    • This search string matches all characters that is not a digit.

    First Substitution/ Replace Regex: "" (nothing, not even a space)

    • Leave the substitute field completely blank, no white space should exist including spaces. This will result in all matched non-digit characters being deleted. You should have gone in with 10 digits + formatting characters prior this operation and come out with 10 digits sans formatting characters.

    Substitution/ Search & Replace #2

    • The second substitution/search and replace search part of the operation captures groups for area code $1, a capture group for the second set of three numbers $2, and the last capture group for the last set of four numbers $3. The regex for the substitute portion of the operation inserts US phone number formatting in between the captured group of digits.

    Second Substitution/ Search Regex: (\d{3})(\d{3})(\d{4})

    Second Substitution/ Replace Regex: \($1\) $2\-$3

    • The backslash \ escapes the special characters (, ) , (<-whitespace), and - since we are inserting them between our captured numbers in capture groups $1, $2, & $3 for US phone number formatting purposes.

    • In TextSoap I created a custom cleaner that includes the two substitution operation actions, so in practice it feels identical to executing a script. I'm sure this solution could be improved but I expect complexity to go up quite a bit. An improved version of this solution is welcomed as a learning experience if anyone wants to add to this.

    0 讨论(0)
  • 2020-12-02 08:22

    Assuming you want the format "(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
    }
    

    Here's a version that allows the optional +1 international code:

    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"
    
    0 讨论(0)
  • 2020-12-02 08:25

    thinking backwards

    Take the last digits only (up to 10) ignoring first "1".

    function formatUSNumber(entry = '') {
      const match = entry
        .replace(/\D+/g, '').replace(/^1/, '')
        .match(/([^\d]*\d[^\d]*){1,10}$/)[0]
      const part1 = match.length > 2 ? `(${match.substring(0,3)})` : match
      const part2 = match.length > 3 ? ` ${match.substring(3, 6)}` : ''
      const part3 = match.length > 6 ? `-${match.substring(6, 10)}` : ''    
      return `${part1}${part2}${part3}`
    }
    

    example input / output as you type

    formatUSNumber('+1333')
    // (333)
    
    formatUSNumber('333')
    // (333)
    
    formatUSNumber('333444')
    // (333) 444
    
    formatUSNumber('3334445555')
    // (333) 444-5555
    
    0 讨论(0)
  • 2020-12-02 08:27

    Possible solution:

    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
    
    0 讨论(0)
提交回复
热议问题