Çocuklar için Regex optimizasyon eğlenceli zaman egzersiz! Bir başlangıç noktası olarak Gnarf en regex alıyor:
^(.)\1*(.)?(?:\1*\2*)*(.)?(?:\1*\2*\3*)*$
Ben sıralı * s Backtracking bir çok neden olabilir, orada burada iç içe ve fark ettim. 'Abcaaax' Örneğin uzunluğunun 3 bir tek \ 1 *, bir tek \ 1, 2 uzunluğunda ardından \ 1 takip uzunluğunda iki bir \ 1 * olarak yıllardan 'o son dize maç çalışacağız \ 1 *, ya da üç tek maç \ 1s. Daha uzun dizeleri var o zaman sorun nedeniyle regex için \ 2 olarak aynı karakter olmaktan \ 1 durdurma şey var, özellikle, çok daha kötü olur.
^(.)\1*(.)?(?:\1|\2)*(.)?(?:\1|\2|\3)*$
Bu Python PCRE'nin eşleşmenin üzerinde test, iki kat daha hızlı orijinal olarak bitti. (Bu üzgünüm, PHP kurduktan daha hızlıdır.)
Bu hala o (.)?
hiçbir maç ve ardından maçın geri kalanı ile taşıyabilen bir sorunu var. \1|\2
Hala maç olacak \ 1 \1|\2
ve \1|\2|\3
maddelerini tanıtmak için çalışırken potansiyel Backtracking sonuçlanan maç için hiçbir \ 2, olsa bile daha önce ne zaman onlar 't maç sonucu. Bu firar hükümlerin tamamının çevresinde ?
optionalness hareket ile çözülebilir:
^(.)\1*(?:(.)(?:\1|\2)*(?:(.)(?:\1|\2|\3)*)?)?$
Bu iki kat daha hızlı daha oldu.
O \ 1, \ 2 herhangi bir ve \ 3 ifadesi eşleşmiyor potansiyel olarak daha geriye gidilmiştir neden, aynı karakter olabilir potansiyel bir sorun hala var. Bu bir önceki karakteri uyuşmuyor olumsuz lookahead kullanarak bunu durdurmak istiyoruz:
^(.)\1*(?:(?!\1)(.)(?:\1|\2)*(?:(?!\1|\2)(.)(?:\1|\2|\3)*)?)?$
Ancak Python benim rastgele test verileri ile bu anlamlı bir hıza fark etmedi. Sizin kilometre test verilerine bağımlı PHP değişebilir, ama zaten yeteri kadar iyi olabilir. Bu burada mevcut olsaydı iyelik-eşleştirme (* +) yardımcı olabilir.
Hayır regex daha kolay okunması Python alternatif daha iyi performans:
len(set(s))<=3
PHP benzer yöntem muhtemelen count_chars ile olacaktır:
strlen(count_chars($s, 3))<=3
Ben hızını test değil ama ben çok fazla bu çok olmasının yanı sıra, okumak için çok güzel regex daha hızlı olması beklenir.
Yani temelde ben sadece tamamen regexes uğraşmaktan vaktimi boşa. Regex başvurmadan önce ilk basit dize yöntemler aramak, zaman israf etmeyin!