/^/
EasyFiles3 min read

File Extension Regex

Extracts and validates the file extension of a filename, requiring at least one character before the final dot.

#file-extension#filename#files#validation#regex

Regex Pattern

^.+\.([a-zA-Z0-9]+)$

Pattern Breakdown

Hover over a token to see what it does.

^.+\.([a-zA-Z0-9]+)$
TokenMeaning
^Anchors the match to the start of the string
.+Matches one or more of any character (the filename stem), greedily
\.Matches a literal dot separating the stem from the extension
(Opens a capturing group for the extension itself
[a-zA-Z0-9]+Matches one or more letters or digits, the extension characters
)Closes the capturing group so the extension can be extracted
$Anchors the match to the end of the string

Detailed Explanation

What it does

This pattern matches a filename that ends in a dot followed by an alphanumeric extension, capturing the extension in group 1. Because .+ is greedy, it matches up to the last dot in the filename, so multi-dot names like archive.tar.gz correctly extract gz rather than tar.gz.

Why it works

The leading .+ requires at least one character before the dot, which is what excludes dotfiles like .gitignore that have no filename stem before their leading dot. Since .+ is greedy, the regex engine backtracks from the end of the string until it finds the rightmost dot that still allows the trailing [a-zA-Z0-9]+ to match, guaranteeing the final extension is the one captured.

Common use cases

  • Extracting a file extension to route uploads to the right handler
  • Validating that a filename has an extension before allowing an upload
  • Filtering directory listings for files of a particular type
  • Building a MIME-type lookup keyed off the captured extension

Edge cases

  • Multi-part extensions like archive.tar.gz only capture the final segment, gz, not tar.gz
  • Dotfiles like .gitignore or .env are rejected because .+ needs at least one character before the dot
  • A trailing dot with nothing after it, like notes., is rejected since [a-zA-Z0-9]+ requires at least one character
  • Extensions with unusual characters, like a version tag file.v1.2, still match because digits are allowed in the extension class

Limitations

  • Does not validate the extension against a known whitelist of real file types
  • Extensions containing characters outside [a-zA-Z0-9], such as a stray hyphen, will not match
  • Does not account for case sensitivity conventions of specific filesystems

Interactive Tester

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

document.pdf archive.tar.gz photo.JPEG

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 fileExtRegex = /^.+\.([a-zA-Z0-9]+)$/;
const match = 'archive.tar.gz'.match(fileExtRegex);
console.log(match?.[1]); // 'gz'

Common Mistakes

Using a lazy .+? before the dot, which grabs the first dot instead of the last in multi-dot filenames

Fix: Keep .+ greedy so it backtracks to the final dot, correctly capturing gz from archive.tar.gz

Forgetting the leading .+ requirement, causing dotfiles like .gitignore to be treated as having an extension

Fix: Require at least one character before the dot with .+\. so dotfiles are excluded

Restricting the extension class to letters only, rejecting valid numeric extensions like .mp3 or .7z

Fix: Use [a-zA-Z0-9]+ to allow both letters and digits in the extension

Performance Notes

  • The greedy .+ can cause some backtracking on long filenames, but since the input is typically short this is negligible
  • Anchoring with ^ and $ prevents partial matches inside a longer string
  • For extension extraction only (no full-string validation), a non-anchored /\.([a-zA-Z0-9]+)$/ is slightly cheaper

Browser Compatibility

EngineSupportedNotes
ChromeYes
FirefoxYes
SafariYes
EdgeYes
Node.jsYes