2010-06-24 5 views
5

ile hangi modelin eşleştiğini belirleme Sadece eğlence için ve düzenli ifadelerle biraz daha aşina olmak için ciddi bir proje olarak değil, bir çevirmen yazıyorum. Aşağıdaki koddan, bununla nereye gideceğimi düşünebilirim (cheezburger kimse?).Regex.Matches

Anahtarlar ve sözlük değer olarak düzenli ifadeler listesini kullanan bir sözlük kullanıyorum yedek değerlerin detaylı listesini içeren bir List<string> olduğunu. Eğer bu şekilde yapacaksam, yedekin ne işe yaradığını anlamak için, anahtarın ne olduğunu bilmem gerekecek, hangi paternin maçı tetiklediğini nasıl çözebilirim?

 var dictionary = new Dictionary<string, List<string>> 
     {      
      {"(?!e)ight", new List<string>(){"ite"}}, 
      {"(?!ues)tion", new List<string>(){"shun"}}, 
      {"(?:god|allah|buddah?|diety)", new List<string>(){"ceiling cat"}}, 
      .. 
     } 

     var regex = "(" + String.Join(")|(", dictionary.Keys.ToArray()) + ")"; 

     foreach (Match metamatch in Regex.Matches(input 
      , regex 
      , RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture)) 
     { 
      substitute = GetRandomReplacement(dictionary[ ????? ]); 
      input = input.Replace(metamatch.Value, substitute); 
     } 

Mümkün olan şey midir, yoksa bu deliliği başarmanın daha iyi bir yolu var mı?

+3

'(?!) Tion' bu hiçbir anlam ifade etmemektedir, çünkü bu sadece 'tion' ile aynıdır. Belki de olumsuz bir bakış mı istiyorsun? '(? polygenelubricants

+0

... ve Buddha, Buddah ... ve tavan kedisi nedir? –

+0

@Tim: Sanırım bir tavan vantilatörü sallayan bir kedi vardı viral pazarlama kampanyası için bir referans. –

cevap

6

Her bir yakalama grubunu normal bir ifadede adlandırabilir ve daha sonra, eşleştirdiğiniz her bir grubun değerini sorgulayabilirsiniz. Bu istediğini yapmana izin vermeli. Aşağıdaki normal ifade kullanarak Örneğin

,

(?<Group1>(?!e))ight 

sonra grup eşleme sonucu eşleşmeler çıkarabilir: Jeff en sağlam yoludur dediği gibi adlandırılmış gruplarını kullanarak

match.Groups["Group1"].Captures 
+1

Teşekkürler, bu tam da ihtiyacım olan şey! – Andrew

+0

@Andrew: Yardım etmek için mutluyum. –

0

.

Gruplara, deseninizde ifade edildiği gibi numaralara da erişebilirsiniz.

(first)|(second) 

kullandığınız olmayan yakalama operatörü dahil etmek istemiyoruz fazla parantezi varsa Elbette

match.Groups[1] // match group 2 -> second 

ile erişilebilir:?

((?:f|F)irst)|((?:s|S)econd) 

match.Groups[1].Value // also match group 2 -> second 
1

You başka bir sorun var. Bu kontrol edin:

string s = @"My weight is slight."; 
Regex r = new Regex(@"(?<!e)ight\b"); 
foreach (Match m in r.Matches(s)) 
{ 
    s = s.Replace(m.Value, "ite"); 
} 
Console.WriteLine(s); 

çıkışı: slight bulunduğunda

My weite is slite.

String.Replace küresel operasyon, bu yüzden olsa weight regex uymuyor, yine de değişmiş olur. Eşleşmeyi, aramayı ve aynı anda değiştirmelisiniz; Regex.Replace(String, MatchEvaluator) bunu yapmanıza izin verecektir.