Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Regular Expression Nasıl Okunur? Literal, Metakarakter, Character Class, Anchor ve Escape Kuralları
Engine pattern'i input'un her başlangıç pozisyonunda soldan sağa dener ve en soldaki eşleşmeyi döndürür; metakarakterleri kaçışlamak, character class aralıklarını doğru yazmak ve anchor'ları bilmek bu yüzden şart. .NET'te \d'nin Arap-Hint rakamlarını, $'ın sondaki \n'i kabul ettiğini gerçek çıktılarla gösteriyor, ISBN-13 ve sipariş numarasını .NET, JavaScript ve grep ile doğruluyoruz.
Quantifier'lar ve Backtracking: Greedy, Lazy, Possessive ve Atomic Group
Greedy quantifier önce alabildiğini alır ve pattern'in geri kalanı tutmazsa karakter karakter geri verir; lazy quantifier az alıp tek tek ekler, ama ikisi de ayırıcıyı arayarak adım harcar ve en doğru, en hızlı yol çoğu zaman negated class'tır. PCRE2'nin adım sayılarıyla greedy, lazy, possessive ve atomic group'u karşılaştırıyor, Bookstore'un access log'undan endpoint, status ve süreyi .NET, JavaScript ve sed ile çekiyoruz.
Gruplar ve Backreference: Capture, Named Group, Non-capturing, Alternation ve Replace'te $1/${name}
Capture group'lar açılış parantezinin sırasıyla numaralanır, ama .NET isimli grupları en sona koyduğu için aynı $2/$1 replacement'ı .NET'te ve JavaScript'te farklı sonuç verir. Named group yazımlarını, ES2025'in tekrar eden grup isimlerini, backreference ile tekrar eden kelimeyi, POSIX'in en uzun eşleşme kuralını ve .NET, JavaScript, sed ve VS Code'un replace syntax'ını gerçek çıktılarla karşılaştırıyor, Bookstore'un CSV'sinde yazar adlarını çeviriyoruz.
Lookaround, Inline Flag'ler ve Unicode: Lookahead, Lookbehind, (?i), \p{L} ve Türkçe Karakterler
Lookahead ve lookbehind karakter tüketmeden bir pozisyonun önünü ya da arkasını kontrol eder; değişken uzunluklu lookbehind .NET ve JavaScript'te çalışır, PCRE2'de sınırlı, ripgrep'te hiç yoktur. Inline flag'leri ve JavaScript'in (?i:…) modifier'larını, \p{L} ile v flag'ini, .NET'te IgnoreCase'in kültüre bağlı olduğu için ıssız ile ISSIZ'in eşleşip eşleşmediğinin ortama göre değiştiğini gerçek çıktılarla gösteriyoruz.
Regex Flavor'ları: .NET, JavaScript, PCRE2, POSIX BRE/ERE ve RE2 Arasındaki Farklar, Glob ile Regex'i Ayırmak
Aynı pattern flavor'a göre çalışır, hata verir ya da hata vermeden başka bir şey eşleştirir: Perl ailesi (.NET, JavaScript, PCRE2) backtracking ile lookaround sunar, RE2 ve Rust regex lineer zaman için bunlardan vazgeçer, POSIX en uzun eşleşmeyi seçer. Aynı probe listesini beş engine'de çalıştırıyor, Prometheus'un =~ ile tam eşleşmesini promtool ile, glob ile regex farkını .gitignore ve PowerShell ile gösteriyoruz.
Komut Satırında ve IDE'de Regex: grep -E/-P, ripgrep, sed, git grep, PowerShell ve Repo Genelinde Find/Replace
Repo genelinde regex ile değişikliği güvenli yapmanın sırası şu: temiz çalışma ağacı, dosya listesini git grep ile almak, rg -r ile önizlemek, sed -E ile uygulamak ve git diff ile kontrol etmek. grep, ripgrep, PowerShell ve IDE'lerin regex farklarını, Bookstore'da interpolation'lı log çağrılarını message template'e çeviren gerçek bir refactor'u ve CRLF'li dosyada $'ın neden eşleşmediğini .NET 11'in AnyNewLine option'ıyla birlikte gösteriyoruz.
.NET'te Regex: GeneratedRegex, RegexOptions, Timeout, NonBacktracking ve Span API'leri
Sabit pattern'ler için [GeneratedRegex] kullan, runtime'da belli olan pattern'leri bir kez oluşturup sakla ve güvenilmeyen input'ta timeout ya da NonBacktracking ver; her çağrıda new Regex(..., Compiled) ölçümümüzde source generator'dan otuz üç bin kat yavaştı. BenchmarkDotNet ölçümü, allocation yapmayan EnumerateMatches, timeout ve NonBacktracking'in reddettiği yapılar, IgnoreCase'in kültürü ne zaman okuduğu ve Bookstore için ISBN doğrulama ile Türkçe slug üretimi gerçek çıktılarla.
Regex'in Bedeli: ReDoS, Catastrophic Backtracking, Okunabilirlik ve Regex'i Test Etmek
İç içe quantifier, çakışan alternation ya da art arda .* içeren bir pattern, neredeyse eşleşen bir input'ta üstel ya da polinom sayıda deneme yapar; ölçümümüzde ^(a+)+$ 28 harfte .NET'te 10 saniye sürdü, NonBacktracking 0,07 ms. Tehlikeli yapıları PCRE2 adım sayılarıyla tanıyor, Cloudflare'in 2019 kesintisini, Angular validator'ı ve sunucu doğrulamasını, (?x) ile okunur pattern'i, xUnit [Theory] ile test tablosunu ve e-posta için MailAddress kararını gösteriyoruz.