GregsEx 0.5.5

dotnet add package GregsEx --version 0.5.5
                    
NuGet\Install-Package GregsEx -Version 0.5.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="GregsEx" Version="0.5.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="GregsEx" Version="0.5.5" />
                    
Directory.Packages.props
<PackageReference Include="GregsEx" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add GregsEx --version 0.5.5
                    
#r "nuget: GregsEx, 0.5.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package GregsEx@0.5.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=GregsEx&version=0.5.5
                    
Install as a Cake Addin
#tool nuget:?package=GregsEx&version=0.5.5
                    
Install as a Cake Tool

Xemele

GregsEx

Match with boundaries. Unlike Greg.

A fast, low allocating regular expression library for .NET with explicit ECMAScript, PCRE2, XML Schema, XPath/XQuery, and POSIX support. GregsEx aims to combine faithful, versioned regex semantics with fast span-based matching, reusable scratch storage, and bounded execution. No external dependencies.

Versions and package feeds

Source Purpose Package feed
v*.*.* Versioned releases NuGet.org stable version
main branch Development previews Feedz preview version

For development previews, add Feedz alongside NuGet.org:

dotnet nuget add source https://f.feedz.io/sebastienros/gregsex/nuget/index.json --name gregsex-preview
dotnet add package GregsEx --prerelease

Features

  • Choose the language, not just the pattern: versioned ECMAScript 2025, PCRE2 10.46, XSD 1.1, XPath/XQuery F&O 3.1, and POSIX Issue 7 C-byte profiles, plus an experimental regular core.
  • Match without materializing strings: Boolean searches, match ranges, and caller-buffer capture offsets over ReadOnlySpan<char> or ReadOnlySpan<byte>, where the flavor admits that representation.
  • Reuse prepared storage: immutable, shareable patterns and disposable workspaces with explicit capacity reservation and opt-in growth.
  • Keep execution bounded: finite compilation, work, and memory limits; cancellation and timeouts; distinct failures instead of false no-match results.
  • Use each flavor's host operations: ECMAScript LastIndex, replacement and splitting; XML membership and F&O functions; POSIX RegExec; PCRE2 partial matches, callouts, iteration, and substitution.
  • Control execution strategy: interpretation, automatic acceleration, optional runtime compilation, and optional source-generated kernels.
  • Deploy with NativeAOT and trimming: Interpreted and source generated modes based one your needs.
  • Use reproducible character rules: select Unicode 16.0 or 17.0 in ECMAScript and XML profiles. Defaults remain pinned to 16.0; PCRE2 10.46 retains its own Unicode 16.0 compatibility data, independent of host tables.

Choose a flavor

Profile Semantics and notable capabilities Subject representation
RegularCoreProfile Experimental ordered regular subset: alternatives, classes, greedy/lazy repeats, numbered captures; no lookaround or backreferences Strict UTF-16/UTF-8 scalars, explicit UTF-16 units, or raw bytes
EcmaScriptProfile ECMA-262 edition 16; legacy Annex B, u/v, d/g/i/m/s/u/v/y, named groups, backreferences, lookaround, Unicode properties and string sets UTF-16, including lone surrogates
XsdProfile XSD 1.1 Appendix G whole-value membership, XML name classes, Unicode categories/blocks, nested class subtraction Strict XML UTF-16 or UTF-8
XPathProfile XPath/XQuery F&O 3.1 substring matching, captures, backreferences, s/m/i/x/q, replacement, tokenization, analysis Strict XML UTF-16 or UTF-8; typed functions use UTF-16 strings
PosixProfile Named Issue 7/2018 BRE/ERE C-byte profiles; leftmost-longest selection and POSIX submatch precedence Bytes 1-255; C/POSIX locales only; no NUL
Pcre2Profile Named PCRE2 10.46 managed standard8/16 profile; recursion, subroutines, assertions, verbs, graphemes, callouts, partial matching Raw 8-bit, UTF-8, raw 16-bit, or UTF-16
OnigurumaProfile Oniguruma 6.9.10 default (Ruby) syntax, as TextMate grammars use it: possessive/atomic groups, variable-length look-behind, subexpression calls, absent repeater; a TextMate multi-pattern scanner UTF-16 (Oniguruma's UTF-16LE decoding)

These are separate languages, not interchangeable option sets. Unsupported syntax or representations produce diagnostics; GregsEx never silently switches flavors or forwards a pattern to another regex engine.

Use shared immutable presets from RegexProfiles, such as RegexProfiles.EcmaScript, RegexProfiles.EcmaScriptUnicodeSets, RegexProfiles.Xsd, RegexProfiles.PosixExtended, or RegexProfiles.Pcre2Utf16, instead of repeatedly constructing common profiles. Constructors remain available for custom flags and policies. The API contract lists every preset and its fixed configuration.

Select a supported Unicode dataset explicitly when constructing a profile:

var profile = new EcmaScriptProfile(
    EcmaScriptFlags.UnicodeSets,
    unicodeVersion: UnicodeVersion.Unicode17_0);
var letters = RegexPattern.Parse(@"\p{L}+", profile);

var xsd = new XsdProfile(UnicodeVersion.Unicode17_0);
var xpath = new XPathProfile(unicodeVersion: UnicodeVersion.Unicode17_0);

UnicodeVersion has explicit Unicode16_0 and Unicode17_0 members, not a moving Latest value. Existing constructors and presets still use Unicode 16. The selected dataset is immutable and appears in profile.DataId. ECMAScript pairs each Unicode version with the corresponding Emoji version; XML retains XML 1.0 Fifth Edition character/name rules for both versions. Source-generated patterns select the same data with [GeneratedPattern(pattern, EcmaScriptFlags.UnicodeSets, UnicodeVersion = UnicodeVersion.Unicode17_0)]. XSD and XPath convenience functions also accept a unicodeVersion argument.

PCRE2 support is the managed standard matcher, not its native C ABI, native JIT, DFA interface, 32-bit library, EBCDIC mode, or serialized native code. POSIX support is specifically PosixBre2018-CByte / PosixEre2018-CByte, not arbitrary locales, GNU/BSD extensions, or Issue 8. The XML APIs are regex operations, not an XML parser, schema validator, or query evaluator.

The detailed contracts for RegularCore, ECMAScript, XML, POSIX, PCRE2, and Oniguruma document exact admission rules and compatibility boundaries. XML behavior includes documented GregsEx interpretations of specification ambiguities; these are not W3C-approved errata.

Quick start

Parse once, match repeatedly

using GregsEx;

var pattern = RegexPattern.Parse("[a-z]+", RegexProfiles.EcmaScript);

Console.WriteLine(pattern.IsMatch("hello 42")); // True

using var workspace = pattern.CreateWorkspace();
ReadOnlySpan<char> input = "hello 42";
var status = workspace.Find(input, 0, out var range);

if (status == RegexSearchStatus.Match)
{
    Console.WriteLine(input.Slice(range.Index, range.Length).ToString()); // hello
}

Convenience pattern.IsMatch(...) creates temporary scratch storage and returns a Boolean; execution failures throw RegexExecutionException. For repeated operations, reuse a workspace. Its IsMatch, Find, and FindCaptures methods return RegexSearchStatus, preserving NoMatch, InvalidInput, DestinationTooSmall, LimitExceeded, Cancelled, and TimedOut separately.

Share a pattern across threads, but use a separate workspace or typed session for each concurrent operation. Workspaces do not grow by default. CreateWorkspace reserves capture capacity; Reserve can prepare more storage. Parsing, workspace creation/growth, and owned output strings allocate separately from warmed searches.

Read capture offsets

using GregsEx;

var pattern = RegexPattern.Parse(@"(?<key>[a-z]+)=(?<value>[0-9]+)", RegexProfiles.EcmaScript);
using var workspace = pattern.CreateWorkspace();
ReadOnlySpan<char> input = "count=42";
Span<RegexCapture> groups = stackalloc RegexCapture[3];
var status = workspace.FindCaptures(input, 0, groups, out var range);

if (status == RegexSearchStatus.Match && groups[2].Participated)
{
    var value = groups[2];
    Console.WriteLine(input.Slice(value.Index, value.Length).ToString()); // 42
}

GroupCount includes group zero, the whole match. Supply at least that many capture slots. Participated distinguishes an absent group from a matched-empty group; captures describe final offsets, not .NET-style capture-history collections. Use a bounded stack buffer for small known patterns and a reusable array for larger or dynamic capture counts.

Offsets always count the original representation: UTF-16 code units for character input, bytes for UTF-8/raw-byte input. Pass the original subject and startAt; slicing the subject first changes the context visible to anchors and lookbehind.

Handle diagnostics and execution limits

using GregsEx;

if (!RegexPattern.TryParse("(", RegexProfiles.EcmaScript, out _, out var diagnostic))
{
    Console.WriteLine($"{diagnostic.Code} at {diagnostic.Offset}");
}

var pattern = RegexPattern.Parse("[a-z]+", RegexProfiles.EcmaScript);
using var workspace = pattern.CreateWorkspace();
using var cancellation = new CancellationTokenSource();

var options = new RegexMatchOptions
{
    CancellationToken = cancellation.Token,
    Timeout = TimeSpan.FromMilliseconds(100),
    Limits = new RegexMatchLimits(maxWork: 100_000)
};

var status = workspace.IsMatch("hello", options: options);

if (status != RegexSearchStatus.Match && status != RegexSearchStatus.NoMatch)
{
    throw new RegexExecutionException(workspace.LastFailure);
}

RegexCompileOptions also accepts RegexCompileLimits and default RegexMatchLimits. Per-call limits can reduce, but not increase, the pattern's safety ceilings. A work budget is not a wall-clock guarantee. Advanced backtracking, recursion, and backreferences remain bounded operations, not a promise of linear execution time.

Flavor-specific operations

ECMAScript: stateful matching, replacement, and splitting

using GregsEx;

var profile = new EcmaScriptProfile(EcmaScriptFlags.Global | EcmaScriptFlags.Unicode);
var pattern = RegexPattern.Parse(@"(?<word>[a-z]+)", profile);
using var matcher = EcmaScriptMatcher.Bind(pattern);
Span<RegexCapture> groups = stackalloc RegexCapture[2];

var status = matcher.ExecNext("one two", groups, out var range);

if (status == RegexSearchStatus.Match)
{
    Console.WriteLine(matcher.LastIndex); // 3
}

var replacementPattern = RegexPattern.Parse("(?<word>[a-z]+)", profile);
using var replacement = EcmaScriptMatcher.Bind(replacementPattern);
Console.WriteLine(replacement.ReplaceAll("one two", "[$<word>]")); // [one] [two]

The typed session supplies Exec, Test, Match, MatchAll, Search, Replace, ReplaceAll, and Split, with private numeric LastIndex state. Exec preserves JavaScript's empty-match behavior; ExecNext requires g or y and advances after empty matches for safe caller iteration. Materialized results and replacements have separate output limits and allocation costs.

This is a typed regex API, not a JavaScript object runtime: coercions, overridden properties, Symbol dispatch, RegExp.compile, and replacement callbacks are outside the ECMAScript host surface.

XML Schema: whole-value validation and UTF-8

using GregsEx;

Console.WriteLine(XsdFunctions.IsValid("bcdf", "[a-z-[aeiou]]+")); // True
Console.WriteLine(XsdFunctions.IsValid("ba", "a")); // False

var pattern = RegexPattern.Parse(
    @"\i\c*",
    RegexProfiles.Xsd,
    new RegexCompileOptions(inputKind: RegexInputKind.Utf8));

using var workspace = pattern.CreateWorkspace();
ReadOnlySpan<byte> input = "item:name"u8;
var status = workspace.Find(input, 0, out var range);

if (status == RegexSearchStatus.Match)
{
    Console.WriteLine(range.Length); // 9 bytes
}

XSD uses whole-value membership, not substring search. ^ and $ are literals, parentheses do not capture, and GroupCount is one. Workspace operations require startAt = 0. \i and \c use XML name rules.

Both XML profiles validate the entire subject against XML 1.0 Fifth Edition character rules and strict encoding, even after an early candidate match. Malformed encodings, lone surrogates, and illegal XML characters are not repaired or ignored.

XPath/XQuery: matches, replace, tokenize, and analyze

using GregsEx;

Console.WriteLine(XPathFunctions.Matches("Hello", "hello", "i")); // True
Console.WriteLine(XPathFunctions.Replace("item-42", "([0-9]+)", "[$1]")); // item-[42]

var tokens = XPathFunctions.Tokenize(",a,", ","); // ["", "a", ""]
var words = XPathFunctions.Tokenize("  one\ttwo  "); // ["one", "two"]
var analysis = XPathFunctions.AnalyzeString("id=42", "([0-9]+)");

foreach (var node in analysis.Nodes)
{
    if (node.Kind == XPathAnalyzeNodeKind.Group)
    {
        Console.WriteLine(analysis.Input.AsSpan(node.Range.Index, node.Range.Length).ToString()); // 42
    }
}

AnalyzeString returns an immutable typed tree of match, non-match, text, and group nodes with parent indices and original UTF-16 ranges. No DOM is required. The functions use F&O replacement and tokenization rules, not .NET substitution rules. XPathRegexException carries the standard FORX0001-FORX0004 codes; resource and output failures remain separate.

POSIX: leftmost-longest byte matching

using GregsEx;

var pattern = PosixFunctions.Parse("(a|aa)(a?)"u8, RegexProfiles.PosixExtended);
using var workspace = pattern.CreateWorkspace();
Span<PosixMatch> matches = stackalloc PosixMatch[3];
var status = PosixFunctions.RegExec(workspace, "aa"u8, matches);

if (status == RegexSearchStatus.Match)
{
    Console.WriteLine($"{matches[0].Start}, {matches[0].End}"); // 0, 2
    Console.WriteLine($"{matches[1].Start}, {matches[1].End}"); // 0, 2
}

Unlike ordered alternatives, POSIX selects the earliest, longest whole match, then applies its submatch priorities. In this example group 1 is aa, and group 2 participates empty. PosixDialect.Basic selects BRE syntax and its backreferences. Typed Parse selects byte input by default; generic RegexPattern.Parse requires new RegexCompileOptions(RegexInputKind.Bytes). RegExec accepts partial output vectors; RegError formats native-style errors.

PCRE2: native-width results and iteration

using GregsEx;

var profile = RegexProfiles.Pcre2Utf16;
var pattern = Pcre2Functions.Parse("(?<word>a+)b", profile);
using var workspace = pattern.CreateWorkspace();
Span<Pcre2OffsetPair> pairs = stackalloc Pcre2OffsetPair[2];
var result = workspace.Match("zaab", 0, pairs);

if (result.Status == Pcre2MatchStatus.Match)
{
    Console.WriteLine($"{pairs[1].Start}, {pairs[1].End}"); // 1, 3
}

using var iteration = workspace.CreateIteration();
var next = iteration.Next("zaab", pairs);

The typed API preserves native return codes, short-vector success, partials, marks, and independent capture endpoints, including valid reversed group-zero ranges produced by reset-start constructs. It also provides substring/name/INFO queries, bounded caller-buffer substitution, and match/substitution/case callbacks. Supply the original subject on every iteration step.

Use TryProject(Pcre2ProjectionPolicy.WholeSubjectValidated, ...) when an eligible typed pattern should expose the generic workspace API. Generic parsing of Pcre2Profile applies that same admission: native behaviors incompatible with whole-subject validation or ordinary match ranges require the typed API.

Execution modes and source generation

The default is RegexExecutionMode.Interpreted. Opt into Auto to let GregsEx choose semantic accelerators and, on an eligible untrimmed JIT runtime, compiled UTF-16 kernels:

using GregsEx;

var pattern = RegexPattern.Parse(
    "((a)|b)+c",
    RegexProfiles.EcmaScript,
    new RegexCompileOptions(executionMode: RegexExecutionMode.Auto));

Console.WriteLine(pattern.ExecutionBackend);
Console.WriteLine(pattern.IsMatch("ababc")); // True

ExecutionBackend reports the selected backend; accelerated interpretation still reports Interpreted. Under trimming or NativeAOT, package build targets disable automatic runtime compilation, leaving compatible accelerators and interpretation available.

For explicit runtime compilation on a supported JIT deployment:

using GregsEx;

var interpreted = RegexPattern.Parse("((a)|b)+c", RegexProfiles.RegularCoreUnicodeScalars);
var compiled = interpreted.Compile();

Console.WriteLine(compiled.IsMatch("ababc")); // True

Compile() returns an immutable pattern without mutating the original. It uses an internal expression-tree compiler and carries RequiresDynamicCode and RequiresUnreferencedCode. It throws when dynamic code is unavailable or the pattern is ineligible, including POSIX, non-UTF-16 plans, and shapes already served by a faster specialized path. It is not the API to use under NativeAOT.

For fixed patterns, the package includes an optional source generator:

using GregsEx;
using GregsEx.SourceGeneration;

internal static partial class Patterns
{
    [GeneratedPattern("((a)|b)+c")]
    internal static partial RegexPattern Core();

    [GeneratedPattern("((a)|b)+c", EcmaScriptFlags.None)]
    internal static partial RegexPattern Ecma();
}

Call Patterns.Core() or Patterns.Ecma() and use the returned pattern normally. Eligible patterns receive build-time C# kernels without runtime code generation. The generator also accepts XPath flags, PCRE2 flags, and GeneratedPatternFlavor.Xsd; unsupported shapes are diagnosed rather than promised arbitrary generated-code coverage. Source generation is never required to consume the library.

A source generator of your own cannot use [GeneratedPattern] (Roslyn generators never see each other's output). It can instead ask the generator assembly for the kernel source and bind it itself:

// In the third-party generator, calling GregsEx.Generator.dll (the consumer's copy) at build time.
var result = GregsEx.SourceGeneration.KernelSource.TryEmit(
    pattern, OnigurumaOptions.CaptureGroup, "Plain", "Capture", OnigurumaCompileOptions.TextMate);
if (result.Status == KernelSourceStatus.Succeeded)
{
    // Emit result.PlainClass and result.CaptureClass (null without capture groups) into the
    // consumer, in a file starting with `using System;`, then bind:
    //   OnigurumaPattern.Parse(pattern, RegexProfiles.OnigurumaTextMate, OnigurumaCompileOptions.TextMate)
    //       .WithGeneratedKernels(result.Fingerprint, Plain.Run, Capture.Run)
}

OnigurumaCompileOptions.TextMate carries the raised compile limits TextMate grammars need; naming it on both sides keeps the emitted and recomputed fingerprints equal by construction.

KernelSource is a supported public surface of GregsEx.Generator.dll, versioned with the library. Load the generator assembly from the consumer's own GregsEx package ($(PkgGregsEx)/analyzers/dotnet/cs/GregsEx.Generator.dll with GeneratePathProperty="true") so the revision emitting the kernels is the one running them; the library ignores a kernel of another revision and runs the interpreter. Declined carries the planner's reason (the GREGEX003 text), Invalid the parse diagnostic (the GREGEX001 content).

See the deployment and trimming details for package layout, feature switches, and execution-mode qualifications.

Build

The package targets net10.0, net8.0 and netstandard2.0; see the platform matrix for what each asset supports. Install the .NET 10 SDK, then:

dotnet restore
dotnet build -c Release --no-restore
dotnet test -c Release --no-build --minimum-expected-tests 1
dotnet pack -c Release --no-build

Sources and examples follow the root .editorconfig: four-space C# indentation, braces on new lines, and var where the type is apparent. Check formatting with dotnet format GregsEx.slnx --severity warn --verify-no-changes.

License and artwork

MIT. Bundled Unicode data, PCRE2-derived data, and the internal FastExpressionCompiler source have additional notices in THIRD-PARTY-NOTICES.txt and the package's licenses/ directory.

The artwork includes SVG masters and PNG exports for the package icon, square logo, and README banner. The anchored ^ / $ mark and purple-to-blue palette take their visual cues from Apex.

BenchmarkDotNet summary

These are shared-workload measurements, not universal speed guarantees. BenchmarkDotNet 0.15.8, .NET 10.0.11 / SDK 10.0.400, Apple M4 Pro, macOS 15.8.1, Arm64 RyuJIT; ShortRunJob and MemoryDiagnoser. Unless marked otherwise, one launch, three warmups, three measured iterations, and a 200 ms target iteration time were used. Measured on 16 October 2026 UTC on a shared, busy host: timings are informational, and small differences are not reliable rankings.

Execution tiers are explicit, not inferred from Auto:

Tier GregsEx BCL (System.Text.RegularExpressions)
Interpreted RegexExecutionMode.Interpreted RegexOptions.None
Runtime-compiled Explicit RegexPattern.Compile() RegexOptions.Compiled
Source-generated [GeneratedPattern] [GeneratedRegex]

Setup verifies the actual GregsEx backend, matching results, capture offsets, and stable prepared storage. Parsing, code generation, workspace creation and warmup are outside the measured methods.

All GregsEx flavors

Mean nanoseconds per operation for boolean matching of ((a)|b)+c against bbaaac, with no flags and the default Unicode version where applicable. All profiles answer the same question on this input; their general semantics remain different. POSIX uses six ASCII bytes; the others use six UTF-16 units. XSD performs whole-value membership, so this table does not compare capture APIs.

Flavor Interpreted (ns/op) Runtime-compiled (ns/op) Source-generated (ns/op)
RegularCore 750.08 58.85 57.95
ECMAScript 259.97 64.06 62.18
XSD 201.22 37.42 37.52
XPath 410.36 38.62 38.69
POSIX ERE 660.90 N/A N/A
PCRE2 8,104.31* 50.83 39.15

N/A means the execution tier is unsupported, not a fallback measurement. Source-generated rows above use compiled generated kernels, not interpreted fallbacks.

* The PCRE2 interpreted cell uses the targeted longer-run confirmation: two launches, six warmups, ten measured iterations per launch, and a 1-second target iteration time. All other cells retain the original common-run settings. The long-match confirmation measured 245.4 microseconds versus the original 362.1 microseconds; both runs are preserved in the report.

ECMAScript versus BCL: time and allocations

The same pattern is in the shared ECMAScript/.NET subset; BCL rows use ordinary .NET semantics, not RegexOptions.ECMAScript. The short subject is bbaaac; the long subject is 256 a characters followed by c (257 UTF-16 units). Captures read group zero and both final subgroups from the short subject. XSD is excluded from capture measurements because its groups are non-capturing.

Workload Tier ECMAScript (ns/op) ECMAScript (B/op) BCL (ns/op) BCL (B/op)
Short IsMatch Interpreted 259.97 0 210.07 0
Short IsMatch Runtime-compiled 64.06 0 58.13 0
Short IsMatch Source-generated 62.18 0 39.11 0
Long IsMatch Interpreted 6,239.03 0 5,311.35 0
Long IsMatch Runtime-compiled 298.85 0 1,858.44 0
Long IsMatch Source-generated 264.64 0 1,723.00 0
Short captures Interpreted 341.79 0 279.66 768
Short captures Runtime-compiled 100.75 0 133.96 768
Short captures Source-generated 92.58 0 131.09 768

Allocation values come from MemoryDiagnoser's raw byte/operation totals, not rounded zero displays. GregsEx writes into a prepared caller-owned capture buffer; BCL uses Match and group objects. The 768 B capture cost describes these APIs and this workload, not an inherent allocation requirement of every BCL operation.

The full 54-case report includes long-input results for all flavors, uncertainty, raw positive allocation totals, retained storage, and measurement warnings. These are matching-only microbenchmarks, not universal flavor rankings or cold-start comparisons. Maintained commands and workload definitions are in benchmarks/README.md.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on GregsEx:

Package Downloads
Tint

TextMate syntax colorization for .NET: VS Code grammars and themes compiled by a source generator, regexes by GregsEx, NativeAOT and trimming safe.

Tint.Grammars

The TextMate grammars of Visual Studio Code, compiled for Tint: one class per grammar, TintGrammars.All and TintGrammars.Find. Trimming keeps only the grammars an application uses.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.5.5 5 10/29/2026
0.5.4 131 10/29/2026
0.5.3 224 10/26/2026
0.5.2 198 10/26/2026
0.5.1 327 10/26/2026
0.5.0 112 10/26/2026
0.4.3 103 10/24/2026
0.4.2 95 10/24/2026
0.4.1 98 10/24/2026
0.4.0 110 10/24/2026
0.3.1 94 10/24/2026
0.3.0 91 10/24/2026
0.2.0 92 10/23/2026
0.1.0 134 10/17/2026