About Regex Tester with Capture Group Highlighting — JavaScript Flags

Writing a regex that works on the first try is rare. The usual cycle — write the pattern, save the file, run the test, read the output, tweak the pattern, repeat — is slow and error-prone, especially when dealing with greedy quantifiers that match too much, lookaheads that silently fail, or character classes that don't cover the range you expected. This tester shows matches in real time as you type both the pattern and the test string, with each capture group listed separately so you can see exactly what `(.+?)` vs `(.+)` captures in your specific input. The engine is your browser's native JavaScript `RegExp`, so the behavior you observe is exactly what your production code will produce — including the quirks of JavaScript's regex engine like lack of lookbehind support in older browsers and Unicode mode differences.

How to Use This Tool

Follow these simple steps to get accurate results in seconds. The whole process takes less than a minute for most inputs.

  1. 1

    Enter the Regex Pattern

    Type your regular expression in the pattern field. Use standard syntax: `\d` for digits, `\w` for word characters, `[]` for character classes, `()` for capture groups, `(?<name>...)` for named groups.

  2. 2

    Toggle Flags

    Click the flag toggles next to the pattern field to enable or disable `g` (global), `i` (case-insensitive), `m` (multiline — `^`/`$` match line boundaries), and `s` (dot-all — `.` matches newlines).

  3. 3

    Type or Paste the Test String

    Enter the text you want to match against. Matches highlight as you type. For multiple test cases, put them on separate lines and use the `m` flag if you want `^`/`$` to match each line.

  4. 4

    Review Capture Groups

    Below the test string, each capture group shows its matched value, index, and group name (if named). Compare these values against what you expected each group to capture.

  5. 5

    Copy for Your Language

    When the pattern works, copy it in JavaScript, Python, or raw format using the copy button. The output includes proper escaping for string literals in each language.

How It Works

The technical details of how this tool processes your input and produces accurate results.

Pattern Compilation and Match Execution

Each keystroke in the pattern field compiles a new `RegExp` object with your chosen flags (g, i, m, s). The compiled regex is executed against the test string using `String.prototype.matchAll()` for global patterns or `RegExp.prototype.exec()` for single-match patterns. Match results — including index positions and captured groups — are collected in a single pass.

Capture Group Extraction and Display

Named capture groups (`(?<name>...)`) are extracted from `match.groups`, and numbered groups from the match array indices. Each group's matched value, start index, and end index are displayed separately below the test string, with named groups showing both their name and index. Empty captures (groups that matched the empty string) are distinguished from non-participating groups (groups that didn't match at all, common in alternation patterns like `(a)|(b)`).

Real-Time Highlighting with Overlap Resolution

Match spans are converted to DOM ranges overlaid on the test string. When the global flag produces overlapping or adjacent matches, each match receives its own colored highlight. Capture groups within each match are shown in a distinct color to distinguish the full match from its sub-captures. The highlighting updates on every keystroke in either the pattern or test string fields, with debouncing for very long test strings.

Key Features

Built to handle real workflows quickly and accurately. Each feature solves a specific problem you'd otherwise need multiple tools or manual steps to address.

Real-Time Match Highlighting

Matches highlight as you type the pattern or modify the test string. Different colors distinguish the full match from individual capture groups within it.

Capture Group Breakdown

Every capture group — numbered and named — is listed with its matched value, start position, and end position. Empty captures and non-participating groups are labeled separately.

Flag Toggles with Instant Re-evaluation

Toggle global (g), case-insensitive (i), multiline (m), and dot-all (s) flags with one click. Match results and highlighting update immediately to reflect the new flag combination.

Modern JavaScript Regex Features

Supports named capture groups (`(?<name>...)`), lookbehind assertions (`(?<=...)` and `(?<!...)`), Unicode property escapes (`\p{L}`), and the `u` flag for proper Unicode handling — all features available in current browser JavaScript engines.

Multi-Language Pattern Export

Copy the regex pattern formatted for JavaScript (`/pattern/flags`), Python (`re.compile(r'pattern', flags)`), or raw pattern string — with proper escaping for each language's string literal syntax.

Benefits of Using Regex Tester with Capture Group Highlighting — JavaScript Flags

Why this tool matters and how it improves your daily work.

Eliminates the Write-Run-Read-Repeat Loop

Testing regex in code means writing a test script, running it, reading console output, modifying the pattern, and running again. This tester shows matches the instant you type — the same pattern that takes 5 minutes of write-run-read cycles in a REPL takes 5 seconds of live iteration here.

Exposes Capture Group Values That Console Logs Don't Show Clearly

When `match[1]` returns `undefined`, you can't tell whether the group didn't participate in the match or matched an empty string. The tester labels both cases distinctly, and shows named group values alongside their indices — context that `console.log(match)` in a script doesn't provide at a glance.

Same Engine as Your Production Code

The tester uses the browser's native JavaScript `RegExp` engine, so the match behavior you observe is identical to what your Node.js or browser code will produce. No discrepancy between testing and production engines — a real problem when testing PCRE patterns in a Python-based tool then deploying to JavaScript.

Flags Visible and Toggleable, Not Buried in Pattern Syntax

Adding or removing a flag at the end of a regex literal (`/pattern/gi` → `/pattern/i`) requires retyping. The flag toggles let you add and remove flags with one click and immediately see how the match set changes — particularly useful for understanding the difference `m` makes to `^` and `$` anchors.

Common Use Cases

Real scenarios where this tool saves time and produces better results than manual methods.

Build Email Validation Patterns with Edge Case Testing

Iterate on an email regex by adding both valid inputs (`user@domain.co.uk`) and tricky edge cases (`user+tag@sub.domain.com`, `user@localhost`, `a@b.c`) to the test string. Watch which ones match and which don't as you tighten the pattern from `.+@.+` to `^[\w.-]+@[\w.-]+\.\w{2,}$`.

Extract Structured Data from Log Lines

Write a pattern like `^(?P<ip>\d+\.\d+\.\d+\.\d+) - - \[(?P<timestamp>.+)\] "(?P<method>\w+) (?P<path>\S+)" (?P<status>\d+)` against actual Apache/Nginx access log lines and verify each named group captures the right value before putting the regex into your log parser.

Debug Greedy vs. Lazy Matching in Production Patterns

A pattern like `"(.+)"` matches from the first quote to the last quote in the entire line — capturing content across multiple quoted strings. Switch to `"(.+?)"` and watch the highlight change from one giant match to individual quoted values, then decide which behavior your code needs.

Test URL Routing Patterns Before Deployment

Paste your Express route pattern's regex equivalent and test it against actual request paths (`/api/v2/users/42`, `/api/v2/users`, `/api/v2/users/42/posts`) to verify the capture groups extract the correct path segments.

Who Uses This Tool

Full-Stack Developers Building Form Validation

iterating on email, phone, and URL validation patterns by testing against both valid and invalid inputs simultaneously, watching which strings match as they refine the pattern

Data Engineers Parsing Log Files

writing extraction patterns to pull IP addresses, timestamps, and status codes from unstructured log lines, verifying each capture group extracts the correct value before deploying to a log pipeline

Security Analysts Writing Detection Rules

crafting and testing patterns to detect SQL injection signatures, XSS payloads, or suspicious User-Agent strings in access logs before deploying the rules to a WAF or SIEM

Pro Tips

Practical advice to get the most out of this tool, based on how experienced users actually work with it.

1

Start with a pattern that matches too much, then add constraints one at a time while watching the highlights change. Writing `\d+` first, then `\d{3}-\d{4}`, then `^\d{3}-\d{4}$` is far faster than trying to produce the final pattern on the first attempt.

2

Put both positive test cases (strings that should match) and negative cases (strings that should not) in your test string. The most common regex bug is over-matching — a pattern that accepts values it shouldn't — and you won't catch it without negative examples.

3

Use named capture groups like `(?<protocol>https?)` instead of numbered groups. Six months from now, `match.groups.protocol` is self-documenting; `match[1]` is not. Named groups also survive pattern reordering without breaking downstream code.

Frequently Asked Questions

Quick answers to the most common questions about this tool. If your question isn't here, contact our support team.

Why does my regex work here but fail in Python?
JavaScript's regex engine differs from Python's in several ways: JavaScript doesn't support atomic groups `(?>...)`, possessive quantifiers `(*+)`, or the `\K` reset operator. Named groups use `(?<name>...)` in JavaScript but `(?P<name>...)` in Python. The `s` flag (dot-all) is standard in Python but must be explicitly enabled in JavaScript. Always test in the target engine before deploying.
Why does `.*` match more than I expect?
The `*` quantifier is greedy — it matches as much text as possible while still allowing the overall pattern to succeed. `".*"` on `"hello" world "foo"` matches from the first quote to the last, capturing `hello" world "foo`. Switch to `.*?` (lazy) to match the shortest possible string: `"hello"` then `"foo"` separately with the `g` flag.
What is the difference between `m` and `s` flags?
The `m` (multiline) flag makes `^` and `$` match the start and end of each line (after/before newlines) instead of only the start and end of the entire string. The `s` (dot-all) flag makes `.` match newline characters, which it normally does not. They control different aspects of matching and can be combined.
Can I test patterns with named capture groups?
Yes. Named groups like `(?<domain>\w+\.[a-z]{2,})` are fully supported. The tester displays each named group's value alongside its name and numeric index. Named groups work with `matchAll()` and `exec()`, producing a `match.groups` object — this is the same API your production code uses.
How do I match Unicode characters like emoji?
Enable the `u` (Unicode) flag to treat the pattern and input as Unicode code points rather than UTF-16 code units. Without `u`, emoji like 👨‍👩‍👧‍👦 (a multi-codepoint sequence) are treated as multiple characters, and `.` matches only a single surrogate. With `u`, `.` matches a full code point and `\p{L}` matches any Unicode letter.

Share this tool

Spread the word on social media

https://toolmetry.pro/dev/regex-tester