# Flavour support Version 0.4.2 exposes twelve executable profiles. “Partial lexical provider” means that Regex Tools recognizes common structure and replacement tokens for explanation only; the named runtime compiler and replacement operation remain authoritative. | Profile | Syntax and execution identity | Replacement | Captures and native offsets | | ----------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | | JavaScript (ECMAScript) | regexpp 4.12.2 with ECMAScript 2025 syntax; current browser `RegExp` executes | Bounded ECMAScript `GetSubstitution` | Named/numbered, final repeated capture; UTF-16 | | PCRE2 | Partial provider; official standalone PCRE2 10.47 8-bit WASM executes in mandatory UTF/UCP mode | Native bounded `pcre2_substitute()` loop | Native named/numbered records, no history; UTF-8 bytes | | PHP | Partial provider; actual PHP 8.5.8 `preg_*` in `@php-wasm/web-8-5` 3.1.46, reporting PCRE2 10.44 | Fixed bounded PHP-token expansion; load-time `preg_replace()` parity | Native named/numbered records, no history; UTF-8 bytes | | Perl | Partial provider; actual Perl 5.28.1 through legacy WebPerl 0.09-beta | Fixed bounded literal/`$$`/`$n`/`${name}` expansion; arbitrary Perl expressions unavailable | Native numbered spans plus bounded name annotations, no history; Unicode code points | | Python | Partial provider; CPython 3.14.2 `re` in Pyodide 314.0.3 | Native bounded `re` expansion | Native named/numbered spans, no history; Unicode code points | | Ruby | Partial provider; CRuby 4.0.0 `Regexp` in ruby.wasm 2.9.3-2.9.4 | Native `gsub`/`sub` iteration plus bounded CRuby 4.0.0-compatible expansion | Native named/numbered spans, no history; Unicode code points | | Java | Partial provider; TeaVM 0.15.0 `java.util.regex`, not OpenJDK | TeaVM single-digit `$n`; no `${name}` | Native numbered ranges plus lexical names, no history; UTF-16 | | C++ | Partial provider; Emscripten 6.0.4 libc++ `std::wregex`; modified ECMAScript grammar by default | Fixed bounded formatter; load-time libc++ `match.format` parity | Numbered captures only, no history; 32-bit `wchar_t` code points | | Go | Partial provider; Go 1.26.5 standard-library `regexp` with RE2 syntax | Fixed bounded expansion; load-time `regexp.ExpandString` parity | Native named/numbered records, no history; UTF-8 bytes | | Rust | Partial provider; Rust `regex` crate 1.13.1, built with rustc 1.97.1 | Fixed bounded expansion; load-time `Captures::expand` parity | Native named/numbered records, no history; UTF-8 bytes | | .NET | Partial provider; .NET 10.0.10 `System.Text.RegularExpressions`, invariant culture | Fixed streaming .NET-token expansion with load-time native `Match.Result` parity | Named/numbered final records, no capture history in this adapter; UTF-16 | | Scala/JVM compatibility | Partial provider; explicitly shares TeaVM 0.15.0 `java.util.regex`; no Scala runtime | Same TeaVM single-digit `$n` subset; no `${name}` | Same ranges as the TeaVM Java adapter; UTF-16 | ## Flags and options - JavaScript exposes `g`, `i`, `m`, `s`, `u`, `v`, `y` and `d`; `u` and `v` are mutually exclusive. - Standalone PCRE2 exposes application iteration `g` plus `i`, `m`, `s`, `x`, `U` and `J`, with match-step, depth and heap limits. UTF/UCP is mandatory. - PHP exposes application iteration `g` plus the reviewed `preg` modifiers `i`, `m`, `s`, `x`, `u`, `U`, `A`, `D`, `J`, `n` and `r`. PHP's `u` is not conflated with standalone PCRE2's mandatory UTF/UCP configuration. - Legacy Perl exposes `g`, `i`, `m`, `s`, `x`, `n` and one of `a`, `d`, `l` or `u`. The two-character `/aa` mode is not exposed. - Python exposes application iteration `g` plus `a`, `i`, `m`, `s` and `x`. - Ruby exposes application iteration `g` plus `i`, `m` and `x`; Ruby `m` includes dot-all behavior. - Java and Scala compatibility expose application iteration `g` plus TeaVM `Pattern` flags `i`, `d`, `m`, `s`, `u`, `x` and the documented `U` compatibility request. - C++ exposes application iteration `g` plus `i`, `n`, `o` and `c`, and a required grammar option: `ECMAScript`, `basic`, `extended`, `awk`, `grep` or `egrep`. - Go exposes application iteration `g` plus `i`, `m`, `s` and `U`. - Rust exposes application iteration `g` plus `i`, `m`, `s`, `U`, `u`, `x` and `R`; Unicode is enabled by default. - .NET exposes application iteration `g` plus `i`, `m`, `s`, `n`, `x`, `r`, `c` and `b`. Execution is always culture invariant; `c` makes that fixed compatibility choice explicit. ## Verified boundaries Every adapter has focused identity, request and result-contract tests. Conformance and browser suites exercise compilation errors, bounded matching, zero-length iteration, range normalization, replacement and worker recovery across the profile set. Pack verifiers additionally check self-hosted assets, metadata, closed-file-set checksums and applicable licences/notices. TeaVM supplies an Apache Harmony-derived class library. It is not OpenJDK and does not implement OpenJDK `Pattern.UNICODE_CHARACTER_CLASS`; `U` means the documented TeaVM compatibility behavior in both the Java and Scala profiles. The Scala profile also does not implement `scala.util.matching.Regex` wrapper or extractor APIs. The Perl target is intentionally legacy. Its unmodified WebPerl loader contains one `eval(code)` site in an optional Perl-to-JavaScript interoperability import. The fixed Regex Tools bridge does not load that facility, accepts pattern and replacement values only as JSON data, uses `no re 'eval'`, rejects `(?{...})` and `(??{...})`, and passes the documented CSP smoke without broad `'unsafe-eval'`. ## Feature scope Static findings, bounded growth probes, benchmarks, generated cases and formatting are ECMAScript-only. Generated-case version 1 requires the complete accepted regexpp AST and verifies every retained label through the actual browser engine. No partial provider is passed through that generator or formatter. Automatic-callout tracing and reviewed C17 code generation are standalone PCRE2-only. The PHP profile does not reuse the standalone PCRE2 10.47 trace or code-generation path because its authoritative engine is PHP `preg` with PCRE2 10.44. Exact-request semantic comparison and subject minimization support only their reviewed ECMAScript/standalone-PCRE2 paths. Other selections are disabled rather than routed through another profile. Results never claim generic twelve-way equivalence.