O nasıl çalışır?
Otomat teorisine bir göz atın
Kısacası, her normal ifadede eşdeğer bir sonlu otomat vardır ve sonlu bir otomat için derlenebilir ve optimize edilebilir. İlgili algoritmalar birçok derleyici kitapta bulunabilir. Bu algoritmalar, awk ve grep gibi unix programları tarafından kullanılır.
Ancak, çoğu modern programlama dili (Perl, Python, Ruby, Java (ve JVM tabanlı diller), C #) bu yaklaşımı kullanmaz. Düzenli bir ifadeyi bir ağaca veya düzenli ifadenin çeşitli alt parçalarını temsil eden yapı dizisine derleyen özyinelemeli bir geri izleme yaklaşımı kullanırlar. En modern "düzenli ifade" sözdizimleri, özyinelemeli geri izleme yaklaşımında önemsiz şekilde uygulanabilir olan normal diller grubunun dışında (sonlu otomata gösterimleri yoktur) geri referanslar sunar.
Optimizasyon genellikle daha verimli bir durum makinesi sağlar. Örneğin: aaaab | aaaac | aaaad'ı düşünün, normal bir programcı on dakika içinde tam olarak basit fakat daha az etkili arama uygulamasını (üç dizgiyi ayrı ayrı karşılaştırarak) alabilir; ancak bunun aaaa [bcd] 'ye eşdeğer olduğunun farkına varmak, ilk dört' a 'aranarak daha iyi bir arama yapılabilir, ardından 5. karakteri [b, c, d]' ye karşı test edin. Optimizasyon süreci, yıllar önce derleyici ev işimden biriydi, bu yüzden bunun en modern düzenli ifade motorlarında da olduğunu varsayarım.
Öte yandan, devlet makineleri, "önemsiz bir uygulama" ile karşılaştırıldığında daha fazla alan kullanmaları nedeniyle, dizeleri kabul ederken bazı avantajlara sahiptir. SQL dizelerinde tırnaktan çıkmak için bir program düşünün, yani: 1) tek tırnak işareti ile başlar ve biter; 2) tek tırnak işareti, iki ardışık tek tırnak işareti ile çıkarılır. Dolayısıyla: ['a' ''] girişi [a '] çıkışını vermelidir. Durum makinesinde, ardışık tek tırnak işaretleri iki durum tarafından ele alınır. Bu iki durum, aşağıdaki şekilde gösterildiği gibi, her giriş karakterinin yalnızca bir kez işleneceği şekilde giriş geçmişini hatırlama amacına hizmet eder:
...
S1->'->S2
S1->*->S1, output *, * can be any other character
S2->'->S1, output '
S2->*->END, end the current string
Bu nedenle, benim görüşüme göre, düzenli ifade bazı önemsiz durumlarda daha yavaş olabilir, ancak optimizasyonun insan tarafından güvenilir bir şekilde yapılamayacağı gerçeği göz önüne alındığında, genellikle elle hazırlanmış bir arama algoritmasından daha hızlı olabilir.
(Bir dize aramak gibi önemsiz durumlarda bile, bir akıllı motor durum haritasındaki tek yolu tanıyabilir ve bu kısmı basit bir dize karşılaştırmasına indirgeyebilir ve durumları yönetmekten kaçınabilir.)
Bir çerçeveden / kütüphaneden belirli bir motor yavaş olabilir, çünkü motor bir programcının genellikle ihtiyaç duymadığı bir sürü başka şey yapar. Örnek: .NET'teki Regex sınıfı, Eşleştirme, Gruplar ve Yakalamalar da dahil olmak üzere bir sürü nesne oluşturur.