Flint 1.1.0
dotnet add package Flint --version 1.1.0
NuGet\Install-Package Flint -Version 1.1.0
<PackageReference Include="Flint" Version="1.1.0" />
<PackageVersion Include="Flint" Version="1.1.0" />
<PackageReference Include="Flint" />
paket add Flint --version 1.1.0
#r "nuget: Flint, 1.1.0"
#:package Flint@1.1.0
#addin nuget:?package=Flint&version=1.1.0
#tool nuget:?package=Flint&version=1.1.0
Flint is a lightweight, zero-dependency C# library that provides fast text matching utilities using the Aho-Corasick algorithm.
Usage Examples
Basic
using Flint;
var matcher = new TextMatcher(new[] { "cat", "dog" });
var results = matcher.Find("The dog chased the cat.");
foreach (var match in results)
{
Console.WriteLine($"Found '{match.Value}' at index {match.StartIndex}.");
}
Output:
Found 'dog' at index 4.
Found 'cat' at index 19.
An optional StringComparison
can be passed to TextMatcher
, influencing it's behavior when performing searches/replacement.
If none is given, it will default to StringComparison.CurrentCulture
.
using Flint;
var matcher = new TextMatcher(new[] { "cat", "dog" }, StringComparison.OrdinalIgnoreCase);
var results = matcher.Find("The DOG chased the CaT.");
foreach (var match in results)
{
Console.WriteLine($"Found '{match.Value}' at index {match.StartIndex}.");
}
Output:
Found 'DOG' at index 4.
Found 'CaT' at index 19.
Find with a callback
TextMatcher
provides an overload of Find
that accepts a callback invoked for each match. This can be convenient to process matches as they are found without allocating a results collection.
using Flint;
var matcher = new TextMatcher(new[] { "cat", "dog" });
matcher.Find("The dog chased the cat.", match =>
{
Console.WriteLine($"Found '{match.Value}' at index {match.StartIndex}.");
});
Output:
Found 'dog' at index 4.
Found 'cat' at index 19.
Scan multiple texts with FindAll
using Flint;
var patterns = new[] { "cat", "dog", "bird" };
var matcher = new TextMatcher(patterns);
var texts = new[]
{
"The dog chased the cat.",
"A bird watched them from above.",
"No animals here."
};
var all = matcher.FindAll(texts);
foreach (var kv in all)
{
Console.WriteLine(kv.Key);
foreach (var m in kv.Value)
{
Console.WriteLine($"Found '{m.Value}' at index {m.StartIndex}.");
}
}
Example output:
The dog chased the cat.
Found 'cat' at index 19.
Found 'dog' at index 4.
A bird watched them from above.
Found 'bird' at index 2.
No animals here.
If you need to scan many input strings and handle matches as they are discovered, use the FindAll
overload that accepts an Action<string, Match>
callback. The callback receives the original text and the match.
using Flint;
var patterns = new[] { "cat", "dog" };
var matcher = new TextMatcher(patterns);
var texts = new[]
{
"The dog chased the cat.",
"A bird watched from above.",
};
matcher.FindAll(texts, (text, match) =>
{
Console.WriteLine(text);
Console.WriteLine($"Found '{match.Value}' at index {match.StartIndex}.");
});
Example output:
The dog chased the cat.
Found 'dog' at index 4.
Found 'cat' at index 19.
A bird watched from above.
Exact (whole-word) matching with MatchMode
The MatchMode
enum lets you require matches to be whole words. This prevents short patterns from matching inside longer words (for example, preventing "he" from matching inside "she").
using Flint;
var patterns = new[] { "he", "she" };
var matcher = new TextMatcher(patterns, StringComparison.CurrentCulture, MatchMode.ExactMatch);
var results = matcher.Find("she sells seashells.");
foreach (var m in results)
{
Console.WriteLine($"Found '{m.Value}' at index {m.StartIndex}.");
}
Output (only the whole-word she
is matched):
Found 'she' at index 0.
Overlapping and nested matches
using Flint;
var matcher = new TextMatcher(new[] { "he", "she", "his", "hers" });
var results = matcher.Find("she is his hero");
foreach (var m in results)
{
Console.WriteLine($"Found '{m.Value}' at index {m.StartIndex}.");
}
Example output:
Found 'she' at index 0.
Found 'he' at index 1.
Found 'his' at index 7.
Found 'he' at index 10.
Replace all matches with a single value
using Flint;
var matcher = new TextMatcher(new[] { "cat", "dog" });
var replaced = matcher.Replace("The dog chased the cat.", "animal");
Console.WriteLine(replaced);
Output:
The animal chased the animal.
Replace matches using a function
using Flint;
var matcher = new TextMatcher(new[] { "cat", "dog" });
var replaced = matcher.Replace(
"The dog chased the cat.",
match => match.Value.ToUpper()
);
Console.WriteLine(replaced);
Output:
The DOG chased the CAT.
Replace each pattern with a different value
using Flint;
var matcher = new TextMatcher(new[] { "cat", "dog" });
var replaced = matcher.Replace(
"The dog chased the cat.",
new[] { "feline", "canine" }
);
Console.WriteLine(replaced);
Output:
The canine chased the feline.
Load patterns from a file
using Flint;
var patterns = File.ReadAllLines("patterns.txt")
.Where(l => !string.IsNullOrWhiteSpace(l));
var matcher = new TextMatcher(patterns);
var text = File.ReadAllText("large_input.txt");
var hits = matcher.Find(text).ToArray();
Console.WriteLine($"Found {hits.Length} matches.");
Support
- .NET Standard 2.0 and .NET 8.0
License
Flint is licensed under the MIT License.
Product | Versions 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 was computed. 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. |
-
.NETStandard 2.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
- Added MatchMode enum to support exact matching in TextMatcher, with the default being MatchMode.Fuzzy for fuzzy searching.