Logo

How to validate phone numbers using regex?

Validating phone numbers with a regular expression can vary widely depending on the country, format, and specific rules (e.g., whether you allow country codes, extensions, etc.). There is no one-size-fits-all regex for every phone number in the world. However, you can write a practical or region-specific regex that catches most typical formats for your use case. Below are a few common approaches.

1. A Simple, Generic “10-Digit” US Phone Number

If you only need to ensure the user enters a 10-digit North American number (like 555-123-4567 or (555) 123-4567), you might do:

<details> <summary>Example Pattern</summary>
^(?:\(\d{3}\)|\d{3})[-.\s]?\d{3}[-.\s]?\d{4}$
  • Explanation:
    • ^(?:\(\d{3}\)|\d{3}) allows either (555) or 555.
    • [-.\s]? optionally matches a dash, dot, or whitespace.
    • \d{3} matches the next 3 digits.
    • [-.\s]? optionally matches a separator again.
    • \d{4} matches the final 4 digits.
    • $ ensures we’re at the end of the string.
</details>

This handles parentheses around the area code, optional separators, etc. Caveat: This doesn’t account for country codes (+1), extensions, or more exotic formats.

2. Adding Support for a Leading +1

If you want to optionally allow +1 for US numbers:

^\+?1?\s?(?:\(\d{3}\)|\d{3})[-.\s]?\d{3}[-.\s]?\d{4}$
  • \+?1?: Zero or one + sign, zero or one “1” digit.
  • \s?: Optional space after the country code.
  • The rest is similar to the simple 10-digit pattern above.

3. Completely Generic “International” Phone Numbers

International standards like E.164 require up to 15 digits, often prefixed by a plus sign. A simplified approach to allow international numbers might be:

^\+?\d{1,15}$
  • ^\+?: Optional “+” sign at the start.
  • \d{1,15}$: From 1 to 15 digits total.

This is extremely permissive—it ensures only digits (and an optional leading plus) but doesn’t handle country-specific lengths or formatting details like spaces or hyphens. You might allow optional separators:

^\+?\d[\d\s.-]{0,14}\d$
  • Ensures the first character after + is a digit, then allows up to 14 more characters which can be digits, spaces, dots, or hyphens.
  • This is still quite permissive and might allow weird spacing or multiple hyphens in a row.

4. Country-Specific Patterns

Many countries have unique phone formats. For example, a simple UK pattern can be different from a French pattern, which differs from an Indian pattern, etc. If you know your target audience is mostly from one country or region, it’s best to craft a pattern specifically for that region’s conventions (including area codes, trunk prefixes, etc.).

5. Best Practices

  1. Keep It Simple
    • Overly strict patterns can reject legitimate phone numbers (e.g., missing or extra parentheses, spacing in unusual places, etc.).
  2. Consider a Library
    • If you need robust international validation, use libraries like Google’s libphonenumber or language-specific wrappers. They parse and normalize phone numbers for you.
  3. Post-Process
    • In many cases, you only need to store digits and possibly a country code. You can strip out non-digit characters and then do simpler numeric checks (e.g., “must be 10 digits if local, up to 15 if international”).
  4. Focus on Use Case
    • If you just want a phone number to “look okay,” a simple pattern is enough. If you need official, validated numbers, consider a more advanced approach (library, actual phone call/SMS verification, etc.).

Example in JavaScript

function isValidUsPhoneNumber(phone) { // Very simple US-based pattern const pattern = /^\+?1?\s?(?:\(\d{3}\)|\d{3})[-.\s]?\d{3}[-.\s]?\d{4}$/; return pattern.test(phone); } console.log(isValidUsPhoneNumber('555-123-4567')); // true console.log(isValidUsPhoneNumber('(555) 123-4567')); // true console.log(isValidUsPhoneNumber('+1 (555) 123-4567')); // true console.log(isValidUsPhoneNumber('12345')); // false

Final Thoughts

Phone numbers vary enormously in format and requirements worldwide. A single “one-size-fits-all” regex either becomes too permissive or unmanageably large. Use a practical pattern for your region or user base, or consider an international library like libphonenumber for more robust validation.

Bonus: Level Up Your Regex & Coding Skills

Regular expressions are an essential tool, but so is a strong JavaScript and system design foundation. For deeper learning, check out these DesignGurus.io courses:

  1. Grokking JavaScript Fundamentals
    Build a solid JS foundation—closures, prototypes, async/await, and more.

  2. Grokking the Coding Interview: Patterns for Coding Questions
    Master common coding patterns for problem solving in interviews and day-to-day tasks.

Looking for personalized feedback? Consider their Coding Mock Interview or System Design Mock Interview with ex-FAANG engineers. Also, explore free tutorials on the DesignGurus.io YouTube channel.

Bottom line: Keep your phone validation scope realistic and practical, especially if users come from multiple regions. When in doubt, use a library that’s frequently updated to handle all edge cases.

CONTRIBUTOR
TechGrind