/^/
MediumValidation5 min read

Mobile Number Regex

Validates a 10-digit mobile number with an optional international dialing prefix such as +91 or +1, allowing a single space or hyphen between the country code and the number.

#mobile#phone#validation#forms#international#input-validation

Regex Pattern

^(?:\+\d{1,3}[-\s]?)?\d{10}$

Pattern Breakdown

Hover over a token to see what it does.

^(?:\+\d{1,3}[-\s]?)?\d{10}$
TokenMeaning
^Anchors the match to the start of the string
(?:\+\d{1,3}[-\s]?)?Non-capturing group marking the entire country-code prefix as optional
\+Literal plus sign that begins an international dialing code
\d{1,3}One to three digits representing the country calling code
[-\s]?An optional single hyphen or whitespace character separating the code from the number
\d{10}Exactly ten digits making up the local mobile number
$Anchors the match to the end of the string

Detailed Explanation

What it does

This pattern checks that a string is a 10-digit mobile number, optionally preceded by a + and a 1-3 digit country calling code with at most one separating space or hyphen. It rejects numbers with the wrong digit count, letters, or multiple separators.

Why it works

The optional non-capturing group at the start greedily attempts to consume a leading plus, calling code, and separator, but because it is wrapped in `?` the engine can also skip it entirely for domestic numbers. Requiring exactly `\d{10}` afterward pins down the local number length, and anchoring with `^`/`$` prevents partial matches such as an 11-digit string with an extra trailing digit.

Common use cases

  • Validating a phone field on a signup or checkout form before submission
  • Normalizing user-entered contact numbers in a CRM import pipeline
  • Filtering SMS recipient lists to remove obviously malformed numbers
  • Client-side validation paired with a stricter server-side libphonenumber check

Edge cases

  • Numbers with country codes that are not exactly 1-3 digits (rare edge codes) will not validate correctly
  • A domestic number with a leading 0 trunk prefix, like 07123456789, is rejected because it has 11 digits with no matching country code
  • Ambiguous strings where the digit count could be split between code and number in multiple ways may fail even though a human would read them as valid
  • Numbers written with parentheses around the area code, like +1 (415) 555-2671, are not supported

Limitations

  • Does not validate that the country code or number actually corresponds to a real, assigned number
  • Assumes a fixed 10-digit local number length, which does not hold for every country
  • Does not support multiple internal separators or extensions
  • For production-grade validation, a dedicated library like libphonenumber is far more reliable than a single regex

Interactive Tester

Edit the pattern or text below — matching runs live in your browser.

9876543210 +919876543210 +91 9876543210

Test Cases

Editable — add your own inputs to see if they pass.

InputExpectedResult
Pass
Pass
Pass
Pass
Pass
Pass
Pass
Pass
Pass
Pass

Language Variants

Production-ready examples in 12 languages.

const mobileRegex = /^(?:\+\d{1,3}[-\s]?)?\d{10}$/;
console.log(mobileRegex.test('+919876543210')); // true

Common Mistakes

Hardcoding a fixed total length that assumes every country code is exactly 2 digits

Fix: Use a flexible `\d{1,3}` quantifier for the country code so 1, 2, and 3 digit codes all validate correctly

Forgetting to allow an optional separator, causing valid inputs like '+91 9876543210' to fail

Fix: Include an optional `[-\s]?` between the country code and the local number

Assuming every country uses a 10-digit local number

Fix: Adjust the local-number quantifier per region, or use a dedicated phone-parsing library for multi-country support

Performance Notes

  • The optional prefix group is small and bounded (at most 3 digits plus one separator), so it cannot cause catastrophic backtracking
  • Fixed-length `\d{10}` quantifiers are fast to evaluate since the engine does not need to explore variable-length alternatives
  • Precompile the regex once outside of loops when validating large batches of phone numbers

Browser Compatibility

EngineSupportedNotes
ChromeYes
FirefoxYes
SafariYes
EdgeYes
Node.jsYes