PCRE vs RE2: Go Neden Farklıdır?
Regex101 gibi popüler sitelerde test ettiğiniz düzenli ifadeler genellikle PCRE (Perl Compatible Regular Expressions) motoru kullanır. PCRE çok yeteneklidir ancak Catastrophic Backtracking adı verilen bir zaafiyeti vardır. Kötü niyetli bir kullanıcı veya hatalı bir regex, sunucunun işlemcisini %100'e kilitleyerek sistemi çökertebilir.
Golang'in yaratıcıları, sistem güvenliğini ve hızını garanti altına almak için regexp kütüphanesini RE2 motoru üzerine inşa etmiştir.
RE2, çalışma süresinin her zaman O(n) lineer zaman karmaşıklığında olmasını garanti eder.
Hangi Özellikler Desteklenmez?
Hız garantisi verebilmek için Go'nun RE2 motoru bazı gelişmiş Regex özelliklerini bilinçli olarak reddeder:
- Lookaheads
(?=...)ve Lookbehinds(?<=...) - Backreferences
\1
Bu araç, yazdığınız pattern'i JavaScript ile değil, bizzat arka plandaki Go sunucumuzda regexp.Compile() ile derler.
Eğer yukarıdaki gibi desteklenmeyen bir özellik kullanırsanız, Go derleyicisinin size vereceği orijinal hatayı anında ekranda görürsünüz.