RegexLite
RegexLite, “başlangıç–bitiş belirteçleri” ile çalışan, Regex gerektirmeyen, span tabanlı ve allocation-minimal bir metin çıkarıcıdır. O(n) tarama yaklaşımıyla basit kurallı senaryolarda hızlı ve öngörülebilir bir alternatif sunar.
Özellikler
RegexLite; open/close belirteçleriyle tarama yapar, gerektiğinde sınırları dahil eder,
eşleşmeleri en kısa/en uzun olarak seçebilir ve iç içe (nested) yapıları isteğe bağlı olarak dengeler.
- Open/Close: char veya string belirteçler (
(...),<div…</div>gibi) - Filtreler:
requiredContainsveexcludedContains - includeBounds: open/close’u çıktıya dahil et/etme
- longest: en kısa (non-greedy) vs. en uzun eşleşme
- allowNesting: dengeli iç içe eşleşmeler
- escapeChar: kaçış karakteri desteği
- StringComparison: Ordinal varsayılan, IgnoreCase/kültür seçenekleri
- Düşük GC: sonuçlar
ReadOnlyMemory<char>; string’e çevirmedikçe allocation yok
open/close + içerir/içermez kurallı senaryolarda
daha basit, hızlı ve öngörülebilir bir alternatif.
Kurulum
Bu proje tek dosyalık bir yardımcıdır. NuGet gerekmez (ileride paketlenebilir).
// 1) Bu dosyayı projenize ekleyin:
RegexLite.cs
// 2) Hedef çerçeve:
.NET 6+
Hızlı Başlangıç
Aşağıdaki örnek, id= içeren <div ... </div> bloklarını yakalar ve bazı kelimeleri dışlar.
// id= içeren <div ... </div> bloklarını çıkar, hidden/disabled geçenleri ele
var rx = new RegexLite(
open: "<div",
close: "</div>",
requiredContains: "id=",
excludedContains: new[] { "hidden", "disabled" },
includeBounds: true, // <div ... </div> dahil
longest: false, // en kısa (non-greedy)
allowNesting: false,
escapeChar: '\\',
comparison: StringComparison.Ordinal);
// İlk eşleşme (Regex.Match gibi)
var m = rx.Match(html);
if (m.Success)
{
// m.Memory → ReadOnlyMemory<char>
// m.Span → ReadOnlySpan<char> (allocation yok)
Console.WriteLine(m.Value); // string'e çevirmek istersen (allocate eder)
}
// Tüm eşleşmeler (Regex.Matches gibi)
foreach (var mm in rx.Matches(html))
{
// Kopyasız işleme:
var span = mm.Span;
}
// Replace — sabit metin
string blocked = rx.Replace(html, "[BLOCK]");
// Replace — evaluator
string tagged = rx.Replace(html, mm => $"[{mm.Value}]");
API Özeti
RegexLite iki kurucu (string/char belirteçler) ve temel Match/Maches/IsMatch/Replace operasyonlarını sağlar.
// String belirteçler
public RegexLite(
string open,
string close,
string? requiredContains = null,
IReadOnlyList<string>? excludedContains = null,
bool includeBounds = false,
bool longest = false,
bool allowNesting = false,
char? escapeChar = null,
StringComparison comparison = StringComparison.Ordinal);
// Char belirteçler
public RegexLite(
char open,
char close,
string? requiredContains = null,
IReadOnlyList<string>? excludedContains = null,
bool includeBounds = false,
bool longest = false,
bool allowNesting = false,
char? escapeChar = null,
StringComparison comparison = StringComparison.Ordinal);
// İlk eşleşme
LiteMatch Match(string input, int startAt = 0);
// Tüm eşleşmeler (liste)
List<LiteMatch> Matches(string input, int startAt = 0, int maxMatches = int.MaxValue);
// Varlık kontrolü
bool IsMatch(string input, int startAt = 0);
// Değiştir — sabit replacement
string Replace(string input, string replacement, int startAt = 0, int maxReplacements = int.MaxValue);
Span/Memory üzerinden ilerle,
gerçekten gerektiğinde .ToString() ile string üret.
Katkı (Contributing)
Öneri ve geri bildirimler için issue açabilir, PR gönderebilirsiniz. Kurumsal akış önerisi: küçük, odaklı PR; açıklayıcı commit mesajları; mümkünse örnek/test ekleme.
- Repo’yu fork’la
- Feature/bugfix branch aç
- Değişiklik + örnek kullanım ekle
- PR aç ve senaryoyu anlat