★ Dev formats · regex
Regex for MAC Address
Matches 48-bit MAC addresses written as 00:1A:2B:3C:4D:5E, 00-1a-2b-3c-4d-5e or Cisco's 001A.2B3C.4D5E. Each branch uses one separator, so mixed forms are rejected without needing a backreference.
- Runs in your browser
- No signup
Try the mac address pattern
Read it in plain English (best-effort)
- ^start of a line
- (?:start a group (not captured)
- (?:start a group (not captured)
- [0-9A-Fa-f]one character from: 0–9, A–F, a–f
- {2}exactly 2 of the previous
- :the character ':'
- )end of group
- {5}exactly 5 of the previous
- [0-9A-Fa-f]one character from: 0–9, A–F, a–f
- {2}exactly 2 of the previous
- |or
- (?:start a group (not captured)
- [0-9A-Fa-f]one character from: 0–9, A–F, a–f
- {2}exactly 2 of the previous
- -the character '-'
- )end of group
- {5}exactly 5 of the previous
- [0-9A-Fa-f]one character from: 0–9, A–F, a–f
- {2}exactly 2 of the previous
- |or
- (?:start a group (not captured)
- [0-9A-Fa-f]one character from: 0–9, A–F, a–f
- {4}exactly 4 of the previous
- .the character '.'
- )end of group
- {2}exactly 2 of the previous
- [0-9A-Fa-f]one character from: 0–9, A–F, a–f
- {4}exactly 4 of the previous
- )end of group
- $end of a line
One sample per line works well with the m flag on anchored patterns.
The pattern, piece by piece
/^(?:(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}|(?:[0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})$/| Part | What it does |
|---|---|
(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2} | six hex pairs separated by colons |
(?:[0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2} | or separated by hyphens |
(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4} | or Cisco's three dotted groups of four |
What it accepts and rejects
Every sample below is checked automatically in JavaScript and Python. The tester above is preloaded with all of them, one per line.
| Should match | |
|---|---|
00:1A:2B:3C:4D:5E | ✓ |
00-1a-2b-3c-4d-5e | ✓ |
aa:bb:cc:dd:ee:ff | ✓ |
001A.2B3C.4D5E | ✓ |
FF:FF:FF:FF:FF:FF | ✓ |
01:23:45:67:89:ab | ✓ |
| Should not match | |
|---|---|
00:1A:2B:3C:4D | ✗ |
00:1A:2B:3C:4D:5E:6F | ✗ |
00:1A-2B:3C:4D:5E | ✗ |
001A2B3C4D5E | ✗ |
GG:1A:2B:3C:4D:5E | ✗ |
00:1A:2B:3C:4D:5 | ✗ |
Copy it into your code
RE2-safeNo lookarounds or backreferences, so the same pattern works in Go's RE2 engine and in Rust's regex crate.
const macAddressRe = /^(?:(?:[0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}|(?:[0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})$/;
export function isValidMacAddress(value) {
return macAddressRe.test(value.trim());
}When not to use regex for this
To normalise MACs for storage or comparison, strip separators, lowercase, and compare the 12 hex characters.
Questions engineers actually ask
Why three branches instead of one with a backreference?
Does it accept 12 hex digits with no separators?
What is catastrophic backtracking?
More dev formats patterns
- UUIDRFC 9562 UUIDs, versions 1–8, with the standard variant bits.^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
- ISO 8601 DateYYYY-MM-DD dates with valid month and day ranges. Format only.^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$
- 24-hour TimeHH:MM or HH:MM:SS in 24-hour format, 00:00 to 23:59:59.^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$
- Semantic VersionThe official semver.org pattern, with pre-release and build metadata.^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
- JWTThree base64url segments starting with eyJ. Shape only, never trust it.^eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$
- Base64Standard padded base64: groups of four with = or == padding.^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
Or browse the full regex library.
More from the workbench
Fine print
Tools: on the house.
Engineer: by the hour.
The regex was free. Code that doesn't need one is the upgrade: typed schemas, validated once at the edge, trusted everywhere after.
I'm Himanshu, an AI and full-stack engineer. I build MVPs, AI agents and the growth plumbing around them for early-stage startups.
