/^/
EasyInternational3 min read

ISO 3166-1 Alpha-2 Country Code Regex

Validates that a string has the shape of an ISO 3166-1 alpha-2 country code: exactly two uppercase letters, such as US, GB, or IN.

#country-code#iso-3166#international#locale#validation

Regex Pattern

^[A-Z]{2}$

Pattern Breakdown

Hover over a token to see what it does.

^[A-Z]{2}$
TokenMeaning
^Anchors the match to the start of the string
[A-Z]Matches a single uppercase letter A through Z
{2}Repeats the uppercase letter match exactly twice
$Anchors the match to the end of the string

Detailed Explanation

What it does

This pattern checks that an input string consists of exactly two uppercase ASCII letters, matching the structural format used by ISO 3166-1 alpha-2 country codes like US, GB, IN, and JP. It does not check the code against the real list of assigned country codes.

Why it works

The character class [A-Z] restricts matches to uppercase Latin letters only, and the quantifier {2} combined with start and end anchors forces the entire string to be exactly two characters long, no more and no fewer, which mirrors the fixed-width structure of the alpha-2 standard.

Common use cases

  • Validating a country field in a signup or shipping address form
  • Checking the shape of a country parameter before looking it up in a reference table
  • Filtering log or CSV data for well-formed country code fields
  • Guarding against obviously malformed input before an API call to a geolocation service

Edge cases

  • Lowercase input like us is rejected since the pattern requires uppercase letters and no case-insensitive flag is set
  • Three-letter codes like USA (ISO 3166-1 alpha-3) are rejected because the length is fixed at exactly two characters
  • Codes containing digits, like U1, are rejected since the character class only allows letters
  • The pattern accepts any two-letter combination shape-wise, including unassigned codes like XX or ZZ, since it performs no lookup against the real ISO list

Limitations

  • Does not validate against the actual set of ~249 assigned ISO 3166-1 codes, only the two-uppercase-letter shape
  • Does not handle user-assigned or reserved codes differently from officially assigned ones
  • Case must be normalized to uppercase by the caller before validation, since the pattern is case-sensitive by default

Interactive Tester

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

US GB IN

Test Cases

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

InputExpectedResult
Pass
Pass
Pass
Pass
Pass
Pass
Pass
Pass

Language Variants

Production-ready examples in 12 languages.

const countryCodeRegex = /^[A-Z]{2}$/;
console.log(countryCodeRegex.test('US')); // true

Common Mistakes

Adding the case-insensitive flag to accept lowercase codes, which silently accepts malformed casing instead of surfacing normalization bugs upstream

Fix: Normalize input to uppercase explicitly before validation, and keep the pattern case-sensitive

Assuming the regex validates real country codes, and skipping a lookup against the actual ISO 3166-1 list

Fix: Pair this shape check with a lookup table or library for codes that must be guaranteed to be real and currently assigned

Using \w{2} instead of [A-Z]{2}, which also matches digits and underscores

Fix: Use [A-Z]{2} to restrict matches to uppercase letters only, matching the actual alpha-2 alphabet

Performance Notes

  • The pattern is fixed-length and anchored, making it effectively O(1) to evaluate regardless of input length beyond the first few characters
  • No backtracking is possible since the quantifier is a fixed count with no alternation
  • For high-volume validation, a plain length and character-range check can outperform regex, but the regex is clearer and fast enough for most use cases

Browser Compatibility

EngineSupportedNotes
ChromeYes
FirefoxYes
SafariYes
EdgeYes
Node.jsYes