açgözlü olmalı, tembel davranıyor, ancak aşağıdaki kodda değil:Regex Ben varsayılan olarak benim <strong>Regex</strong> istediğim açgözlü davranış gösteren düşündüm
Regex keywords = new Regex(@"in|int|into|internal|interface");
var targets = keywords.ToString().Split('|');
foreach (string t in targets)
{
Match match = keywords.Match(t);
Console.WriteLine("Matched {0,-9} with {1}", t, match.Value);
}
Çıktı:
Matched in with in
Matched int with in
Matched into with in
Matched internal with in
Matched interface with in
Şimdi ben ben sadece uzunluk azalan anahtar kelimeleri sıralanmış eğer bu küçük örneğin işe ancak
-
farkında olduğumuzdan o alfabetik sırayla onları tutmak önemlidir
- Ben beklendiği gibi bu neden çalışmadığını anlamak istiyorum ve
- Ben üzerinde çalışıyorum fiili proje Regex daha birçok kelime vardır ve .
Bu yüzden sorum şu: Bu neden tembel ve nasıl düzeltebilirim?
Gerçek kullanımınızın daha karmaşık olup olmadığından emin değilim, ancak yukarıdaki örnek aslında yaptığınız şey ise, IndexOf yöntemi ile eşleşmeleri arayan sözcük listenizde döngüden bin kat daha iyi olacağını düşünüyorum . Regex, bir değişimde sadece bir grup kelime içeriyorsa, performans muhtemelen berbat olacaktır. – Josh
@Josh - Hayır, örnek basitleştirildi. Gerçek uygulama lexers ve dilbilgisi ayrıştırıcıları oluşturmak için dil dosyalarını okuyor. Ben regex'imde biraz paslıyım; Benim sorunum şimdi çok açık görünüyor! – Stomp
@Josh: Regex motorları, ortak bir önekle eşleşemedikten sonra birçok kontrolün atılması dahil olmak üzere, bu tür durumlar için birçok optimizasyon yapabilir. Örneğin, eğer ilk karakter "i" değilse, "i" ile başlayan dalların hiçbiri kontrol edilmeyecektir. .NET motorunun bunu yapıp yapmadığından emin değilim, ama yapmadıysa şaşırdım. –