UseToolSuite UseToolSuite

Regex Tester

Test and debug regular expressions with real-time match highlighting, group extraction, and flag support. Runs instantly in your browser.

Battle-tested patterns to start from

TargetPattern
Email (pragmatic)^[^\s@]+@[^\s@]+\.[^\s@]+$
IPv4 address^(\d{1,3}\.){3}\d{1,3}$ (validate octets ≤255 in code)
ISO date^\d{4}-\d{2}-\d{2}$
Slug^[a-z0-9]+(?:-[a-z0-9]+)*$
Hex color^#(?:[0-9a-fA-F]{3}){1,2}$

Treat these as starting points: the “perfect” email regex is a famous trap — RFC 5322 allows things no signup form should accept. Validate shape with a simple pattern and confirm deliverability by actually sending the email.

Capture groups: numbered, named, non-capturing

Parentheses do three jobs. (...) captures by number, (?<year>...) captures by name — far more maintainable in replacement strings ($<year>) and in code — and (?:...) groups without capturing, which keeps numbering stable and is marginally faster. A pattern littered with unnamed groups becomes write-only; naming the two or three groups you actually extract is the single highest-leverage readability habit in regex.

When the answer isn’t a bigger regex

Regular expressions match regular languages — they fundamentally cannot parse arbitrarily nested structures. If you’re matching HTML tags with their contents, balanced parentheses, or JSON substrings, the pattern that “almost works” will fail on real input forever. Reach for a real parser (DOMParser for HTML, JSON.parse for JSON) and use regex for what it excels at: tokens, line formats, log fields, and validation of flat shapes.

Performance habits for production patterns

Anchor everything you can (^...$ lets the engine fail fast), prefer character classes over alternation ([abc] beats (a|b|c)), and be precise instead of reaching for .* — greedy dot-star forces backtracking across the whole input on failure. If a pattern runs on user-supplied text on a server, test it here against pathological inputs (long strings of almost-matches) before deploying; ReDoS is just catastrophic backtracking weaponized.

is compiled away. */}

Last updated

How helpful was this tool?

Click to rate

Embed this tool on your site

Paste this snippet into any HTML page or blog post to embed a live, fully working copy of Regex Tester. Free for any use.

Key Concepts

Capture Group

A portion of a regex pattern enclosed in parentheses () that extracts and remembers the matched substring. Capture groups allow you to isolate specific parts of a match — for example, (\d{4})-(\d{2})-(\d{2}) captures year, month, and day separately from a date string. Groups are numbered from left to right and can be referenced in replacements.

Regex Flags

Modifiers appended to a regex pattern that change its matching behavior. Common flags: g (global — find all matches, not just the first), i (case-insensitive), m (multiline — ^ and $ match line boundaries), s (dotAll — . matches newlines), and u (unicode — enables Unicode property escapes and correct surrogate pair handling).

Lookahead and Lookbehind

Zero-width assertions that check whether a pattern exists ahead of or behind the current position without consuming characters. Lookahead (?=...) matches if the pattern follows; negative lookahead (?!...) matches if it does not. Lookbehind (?<=...) and negative lookbehind (?<!...) work in the reverse direction. They are essential for complex validation and extraction patterns.

Frequently Asked Questions

Which regex flavor does this tool use?

This tool uses JavaScript regular expressions, which follow the ECMAScript specification. Most common regex features are supported including lookahead, lookbehind (in modern browsers), character classes, and quantifiers.

Can I use regex flags like global, multiline, and case-insensitive?

Yes. The tool supports all standard JavaScript regex flags including g (global), i (case-insensitive), m (multiline), s (dotAll), and u (unicode). You can toggle these flags in the interface.

Does the tool show captured groups?

Yes. When your regex contains capture groups using parentheses, the tool displays each matched group separately. This makes it easy to debug complex patterns and verify that your groups capture the expected content.

Why does my regex work here but not in Python or Java?

Different programming languages implement different regex flavors. JavaScript regex lacks some features found in PCRE (PHP, Python) such as possessive quantifiers and recursive patterns. Always test your regex in the target language environment for final validation.

Why does my regex freeze the browser on long input?

That's catastrophic backtracking: patterns with nested quantifiers like (a+)+ or (\w+\s?)* can force the engine to try exponentially many ways to match before failing. Rewrite so alternatives can't overlap — replace (\w+\s?)* with [\w\s]*, anchor the pattern, or make quantifiers possessive in engines that support it.

Does JavaScript regex support lookbehind?

Yes — (?<=...) and (?<!...) are supported in all modern browsers (since ES2018). If you maintain code for very old environments, the workaround is matching a larger portion and extracting the desired part with a capture group instead.

Troubleshooting & Technical Tips

Catastrophic Backtracking: Regex freezes the browser

Patterns containing nested quantifiers (e.g., (a+)+ or (a|b)*c) can cause exponential time complexity on long non-matching inputs — this is known as "catastrophic backtracking" and is the basis of ReDoS (Regular Expression Denial of Service) attacks. Solution: avoid nested quantifiers, use atomic grouping or possessive quantifiers (not available in JS — restructure the pattern instead). Use this tool with short test strings to detect backtracking issues in your patterns.

Lookbehind assertion not supported: (?<=...) error

JavaScript lookbehind (?<=...) and negative lookbehind (?<!...) assertions were introduced in ES2018 and now work in all modern browsers including Safari 16.4+. However, older browsers (IE, older Safari) will throw a SyntaxError. Lookahead (?=...) is universally supported across all browsers. Check your target audience's browser compatibility, or alternatively use a capture group and filter the result with post-processing.

Unicode character matching fails: Non-ASCII characters and \w pattern

In JavaScript regex, \w only matches [A-Za-z0-9_] and does not include non-ASCII characters (accented letters, CJK characters, etc.). To match Unicode characters, use the u (unicode) flag with Unicode property escapes: \p{Letter} or \p{Script=Latin}. For example, /\p{L}+/gu matches letters from all languages. Enable the u flag in this tool to test your Unicode patterns.

Email validation regex rejects valid addresses

There is no single "perfect" regex for email validation — the RFC 5322 specification is extremely complex. Simple patterns (^[a-z]+@[a-z]+\\.[a-z]+$) reject many valid addresses: plus signs (user+tag@), subdomains, and internationalized domain names (IDN). Practical solution: use a broad pattern like /^[^\s@]+@[^\s@]+\.[^\s@]+$/ and perform real validation by sending a confirmation email. Test your pattern against various email formats using this tool to verify its coverage.

Related Guides

Related Tools