Help:CirrusSearch/RegexTooComplex
Not: Bu sayfayı düzenlerken katkınızı CC0 altında yayınlamayı kabul edersiniz. Daha fazla bilgi için Kamu Malı Yardım Sayfalarına bakın. |
insource://
sözdizimi, Lucene'nin lehçesi ile yazılmış oldukça verimli düzenli ifade aramaları uygular.
Verimlilik nedeniyle, bu normal ifadelerin ne kadar karmaşık olabileceğinin bir sınırı vardır.
Hangi sözdizimi karmaşık kabul edilir?
Karmaşıklıktaki en büyük artış, determinizm olmama ve ardından tekrarlamadan kaynaklanır. Şuna benzer:
insource:/[ac]*a[ac]{50,200}/
[ac]*
kısmı deterministik değildir ve [ac]{50,200}
bir yinelemedir.
Öte yandan bu daha iyi:
insource:/[ac]*a[de]{50,200}/
Çünkü [de]{50,200}
, [ac]*
ile çakışmaz.
Hâlâ karmaşık ve hâlâ tam olarak hızlandırılamıyor, ancak tamamen reddedilmiyor ve onu eşleştirmeye çalışacağız.
Genellikle tekrar, buna değer olduğundan daha fazla karmaşıklık ekler. Tekrarlamak daha iyi, yani:
insource:/[ac]*a.*[^"]+\"/
şundan çok daha az karmaşıktır:
insource:/[ac]*a.*[^"]{50,100}\"/
Neden?
Lucene, düzenli ifadeleri DFA'lara olarak derler. Bunu, düzenli ifadeleri NFA'lara dönüştürerek ve sonra bunları DFA'lara dönüştürerek yapar. It does this by converting the regular expressions to NFAs and then converting those to DFAs. O işlem için en kötü durum karmaşıklığı, NFA'daki durumların sayısı üzerinde üsseldir ve NFA'nın durum sayısı. Belirsizlik ve ardından tekrarlama, ardından tekrar bu üstel durum büyümesini tetikler. Tüm hafızamızı yemelerini önlemek için devlet sayısını 20.000 ile sınırlandırıyoruz.