7.9 KiB
Flavour support
Version 0.4.1 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,yandd;uandvare mutually exclusive. - Standalone PCRE2 exposes application iteration
gplusi,m,s,x,UandJ, with match-step, depth and heap limits. UTF/UCP is mandatory. - PHP exposes application iteration
gplus the reviewedpregmodifiersi,m,s,x,u,U,A,D,J,nandr. PHP'suis not conflated with standalone PCRE2's mandatory UTF/UCP configuration. - Legacy Perl exposes
g,i,m,s,x,nand one ofa,d,loru. The two-character/aamode is not exposed. - Python exposes application iteration
gplusa,i,m,sandx. - Ruby exposes application iteration
gplusi,mandx; Rubymincludes dot-all behavior. - Java and Scala compatibility expose application iteration
gplus TeaVMPatternflagsi,d,m,s,u,xand the documentedUcompatibility request. - C++ exposes application iteration
gplusi,n,oandc, and a required grammar option:ECMAScript,basic,extended,awk,greporegrep. - Go exposes application iteration
gplusi,m,sandU. - Rust exposes application iteration
gplusi,m,s,U,u,xandR; Unicode is enabled by default. - .NET exposes application iteration
gplusi,m,s,n,x,r,candb. Execution is always culture invariant;cmakes 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.