SORU
23 Temmuz 2010, Cuma


'arasında " fark;gruplar" ve "yakalar" ne .NET düzenli ifadeler?

""Yakalama konusunda. "" ve bir grup arasında, ne fark var, biraz kafam karışık NET düzenli ifade dili. Aşağıdaki düşünün C# kod:

MatchCollection matches = Regex.Matches("{Q}", @"^\{([A-Z])\}$");

Bu harf için tek bir çekim içinde sonuç bekliyorum 'S', ama eğer döndürülen özelliklerini ben yazdırma MatchCollection, görüyorum

matches.Count: 1
matches[0].Value: {Q}
        matches[0].Captures.Count: 1
                matches[0].Captures[0].Value: {Q}
        matches[0].Groups.Count: 2
                matches[0].Groups[0].Value: {Q}
                matches[0].Groups[0].Captures.Count: 1
                        matches[0].Groups[0].Captures[0].Value: {Q}
                matches[0].Groups[1].Value: Q
                matches[0].Groups[1].Captures.Count: 1
                        matches[0].Groups[1].Captures[0].Value: Q

Burada tam olarak neler oluyor? Ayrıca maç boyunca bir çekim olduğunu biliyorum, ama ne gruplar var mı? Ve neden mi matches[0].Captures mektup için yakalama içermeyen ''? S

CEVAP
23 Temmuz 2010, Cuma


Bu konuda bulanık olan ilk olmayacak. Jeffrey Friedl ünlü söz (sayfa 437) vardır:

Sizin bakış bağlı olarak, ya da ekler yeni boyut için ilginç bir MAÇ SONUÇLARI, ya da karışıklık ekler ve bloat.

Daha da ileri giderek:

Bir Grup arasındaki temel fark nesne Yakalama ve nesne olmasıdır her Grup nesnesi içeren bir Yakalar temsil eden koleksiyonu tümAratarafından maçlar maç sırasında grup olarak nihai metin grubu ile eşleşti.

Ve birkaç sayfa sonra, bu onun sonucu

Geçmiş aldıktan sonra .NET dokümantasyon ve aslında bu nesneler eklemek ne anlama Onlar hakkında karışık duygular var. Üzerinde bir yandan, ilginç bir şey yenilik [..] öte yandan, verimli bir yük [..]eklemek gibi görünüyor kullanılmayacak bir işlevsellik çoğu durumda

Çok benzer, ama ara sıra olduğu gibi, onlar için bir kullanım bulabilirsiniz. başka bir deyişle: Başka bir gri sakal büyümek önce bile Yakalar düşkün haklayabilirsin


Diğer yazı dedi ne yukarıda, ne de gerçekten sorunun cevabı göründüğü için, aşağıdakileri göz önünde bulundurun. Tarihin bir tür izci olarak Yakalar düşünüyorum. Ne zaman normal ifade yapar maçı, geçer dize soldan sağa doğru (görmezden gelerek aynı yere geri gitmek için bir an) ve zaman karşılaştığı bir eşleştirme yakalama parantez olacak saklayan $x (x herhangi bir sayı), diyelim ki $1.

Yakalama parantez içinde tekrarlanacak zaman Normal düzenli ifade motorları uzaklara $1 geçerli atmak ve yeni bir değer ile değiştirin. Değil .Bu tarih tutacak ve Captures[0] yerleştirir ve NET.

Eğer değiştirirsek eğer aşağıdaki gibi bakmak için düzenli ifade

MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"(\{[A-Z]\}) ");

göreceksiniz ilk Group olacak Captures (birinci grup her zaman olmak bütün maç, yani, eşit $0) ve ikinci grup yapacak {S}, yani sadece son eşleşen grup. Ancak, burada sorun nerede, bulmak istediğiniz diğer iki yakalar, onlar Captures, içeren bütün aracı yakalar {Q} {R} ve {S}.

Eğer sadece açıkça dize tek tek yakalar son maç gösteren çoklu-çekim, nasıl merak varsa, Captures kullanmanız gerekir.

Son sorunuz üzerine son bir söz: toplam maç toplam her zaman bir Çekim vardır, bireysel Gruplar ile bu karışımı yok. Yakalar sadece grupları içinde ilginç.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • katherine gomez

    katherine go

    1 Aralık 2011
  • Matthew Smith

    Matthew Smit

    24 Mayıs 2010
  • Sorikan

    Sorikan

    3 ŞUBAT 2008