Regex Tester & Code Generator

Test regular expressions with live matching and generate code examples for supported languages.

Preset Patterns
/g28 / 4,000 pattern chars57 / 150,000 test chars

Test String

0 Matches
57 characters · 3 lines0.00 ms execution time
Showing 0–0 of 0 matches
* Note: Match start and end offsets are zero-indexed UTF-16 code units (ECMAScript specification).

No matches found in test string.

100% Client-Side Engine•0 matches•0 captured groups•0.00 ms
Zero Network Exfiltration · Private Sandbox

Regular Expression (Regex) Guide: ECMAScript Engine, Flag Mechanics & Safe Testing

Regular Expressions (Regex) are declarative patterns used for pattern matching, validation, find-and-replace transformations, and string tokenization. Modern web browsers evaluate regular expressions using high-performance ECMAScript regex engines (such as V8 in Chromium, SpiderMonkey in Firefox, and JavaScriptCore in WebKit). Because backtracking regex engines evaluate non-deterministic finite automata (NFA), flawed patterns can trigger severe performance degradation or catastrophic backtracking.

Execution Architecture & Client-Side Safeguards

KivaroTools executes regular expressions with multiple client-side safety measures:

  • Isolated Web Worker Execution: All evaluation runs inside a dedicated background Web Worker, ensuring that text input, scrolling, and tab switching remain responsive even during intensive evaluations. If Blob workers are restricted, a guarded synchronous fallback prevents application errors.
  • 1,200 ms Timeout Guard: If a regex fails to complete within 1,200 milliseconds, the host thread forcefully terminates the worker and reports an execution timeout, preventing infinite CPU spinning.
  • Zero-Width Match Protection: Empty matches (such as \b, ^, or (?=...)) automatically advance the regex search index with full Unicode surrogate pair awareness, preventing infinite loops.
  • Structural Risk Heuristic: The static analyzer scans for known catastrophic backtracking shapes: nested quantifiers (e.g. (a+)+), ambiguous alternations (e.g. (a|ab)+), and broad unanchored wildcard repetitions. Note: This heuristic serves as an early-warning diagnostic, not a formal mathematical proof of immunity under all adversarial inputs.
  • Formula Injection Defense: All match data exported as CSV is sanitized to neutralize spreadsheet formula prefixes (=, +, -, @).

ECMAScript Regular Expression Flags

FlagNameBehavior
gGlobalFinds all matches throughout the text rather than stopping after the first occurrence.
iIgnore CaseTreats uppercase and lowercase characters as equivalent ([a-z] matches [A-Z]).
mMultilineAnchors ^ and $ match the start and end of every line (\n), not just start and end of string.
sDotAllAllows the dot (.) wildcard to match newline characters (\n, \r).
uUnicodeEnables full Unicode code point support, surrogate pair stepping, and Unicode property escapes (\p{Letter}).
yStickyMatches only from the exact position indicated by the lastIndex property.
dIndicesGenerates precise character start and end offsets for each capture group in match.indices.

Lookaround Assertions: Syntax & Usage

Lookarounds match positions without consuming characters, making them invaluable for validation requirements:

Assertion TypeSyntaxMeaning
Positive Lookaheadq(?=u)Matches "q" only if followed immediately by "u".
Negative Lookaheadq(?!u)Matches "q" only if NOT followed immediately by "u".
Positive Lookbehind(?<=\$)\d+Matches digits only if preceded immediately by a dollar sign ($).
Negative Lookbehind(?<!\\)"Matches a quotation mark only if NOT preceded by a backslash.

Cross-Language Compatibility Considerations

While ECMAScript syntax is widely used, regular expression engines differ significantly across language runtimes:

  • Python (re module): Uses (?P<name>...) for named groups and (?P=name) for pattern backreferences. Standard Python requires fixed-width lookbehind assertions and does not support the \p{...} syntax without the third-party regex package.
  • Java (java.util.regex): Supports (?<name>...) named groups since Java 7. Java has no global flag; iteration is handled with while (matcher.find()).
  • Go (regexp package): Uses the Google RE2 engine, which guarantees linear-time O(n) execution. To prevent exponential backtracking, RE2 intentionally omits support for lookarounds and backreferences.

Frequently Asked Questions

How does the Web Worker protect against browser freezes during catastrophic backtracking?
Regular expressions are compiled and executed inside an isolated background Web Worker rather than on the browser main UI thread. The host thread enforces a strict 1,200 ms execution timeout. If a pattern enters an exponential backtracking loop, the worker thread is terminated and a fresh worker is initialized, keeping text input, page scrolling, and the user interface completely responsive.
Does the static regex risk scanner guarantee complete immunity against Regular Expression Denial of Service (ReDoS)?
No. The static risk analyzer is an early-warning heuristic that scans for common high-risk structures—such as nested quantifiers like (a+)+, overlapping alternations under repetition like (a|ab)+, and broad unanchored wildcard repetitions. While effective at catching common pitfalls, static heuristics cannot mathematically prove that an arbitrary regular expression is completely ReDoS-safe under all adversarial inputs.
What is the difference between greedy and lazy (reluctant) quantifiers?
Greedy quantifiers (*, +, {n,}) consume as many characters as possible and only backtrack when subsequent pattern tokens fail to match. Appending a question mark makes the quantifier lazy (*?, +?, {n,}?), instructing the engine to consume the absolute minimum number of characters necessary to satisfy the expression before proceeding.
How do lookaround assertions work, and do they consume characters in the match?
Lookarounds are zero-width assertions: they inspect the text immediately following (lookahead) or preceding (lookbehind) the current match index without advancing the search pointer or capturing characters into the final matched string ($0). For example, (?<=\$)\d+ matches digits only when preceded by a dollar sign, but the dollar sign is not included in the matched string.
Why do named capture groups written in JavaScript fail when ported to Python?
JavaScript conforms to ECMAScript syntax (?<name>...) and backreferences \k<name>. Standard Python re uses PCRE-style syntax (?P<name>...) and backreferences (?P=name) or \g<name> in replacements. KivaroTools provides an automated code generation tab that exports your expression into Python syntax with these conversions applied.
How does String.prototype.split() behave when the regex contains capturing parentheses?
In ECMAScript, if your split delimiter pattern contains capturing parentheses (e.g., \s*([,;])\s*), the captured delimiter characters are spliced directly into the returned output array alongside the split text segments. To split text without retaining the delimiters, use non-capturing groups (?:[,;]).
Are my regular expressions or test strings uploaded to a server?
No. All regular expression compilation, pattern explanation, replacement evaluation, split testing, and benchmarking execute locally inside your browser runtime. Confidential logs, proprietary text, and test fixtures never leave your device.
How are match start and end character offsets measured?
In accordance with the ECMAScript specification, match start and end indices are measured as zero-indexed UTF-16 code units. For standard ASCII and BMP characters, each character equals one code unit. Astral plane characters (such as emojis or rare historical scripts) occupy two UTF-16 code units (surrogate pairs).

Explore other utilities in Developer Tools and complementary workflows.

View all Developer Tools →