2011-09-08 23 views
5

Genelde, bir normal ifadeyi ayrıştırmak ve yakalama gruplarına geri değer katmak için birçok koşul ve/veya döngü ile son bulurum ve bu sorunu basit bir şekilde çözmesi için deneyimli yanıtlar arıyorum. X(?<xid>\d+)-(?<xsub>\w+)\.xml gibi bir normal ifade deseni gibi dosya maç için tasarlanmıştır adlı yakalama grupları "xid" ve "XSUB" sahip olan belirli ÖrneğinDeğerleri bir Regex modeline dönüştürerek bir dize oluşturmanın en kolay yolu?

: X1-foo.xml, X555-bar.xml argümanlarla sağlandığında, vb: int xid=999, string xsub="baz", düzgün bir dosya adı oluşturmak için desen gruba bu değerleri arasına sokmak istiyorum:

basit tutmak için X999-baz.xml, açık yakalar iç içe değildir. String.Format olmadan


:

String.Format("X{0}-{1}.xml", xid, xsub) ancak ben zaten herhangi bir dosya adı dizeden bu değerleri ayrıştırmasını bir Regex desen var ve istedikleri gibi bu kavram kolayca .NET dize biçimi öğeleri ile gerçekleştirilir

Aynı kalıbı, doğruluk için bir dosya adını yeniden oluşturarak zıt yönde gitmek için kullanmak. Bir dize, ancak dosya adını yeniden oluşturmak için biçimlendirilmiş öğeleri içeren bir dize ayrıştırmak için bir regex desen gerekiyorsa, bunları yazarken, daha büyük bir el ile hata şansı oluşturmak için kullanılacak iki tür farklı sözdizimi gerektirir. yanlışlıkla regex desen eşleşmesinin sonucunu düzgün bir şekilde yeniden oluşturmayan kötü bir biçim öğesi dizesi oluşturur veya bunun tersi de geçerlidir.

cevap

0

Bu yanlış okumuş olabilir, ancak System.Text.RegularExpressions ad alanında Regex.Replace yöntemine gereksiniminiz olduğu anlaşılıyor.

string pattern = "Your pattern"; 
string replacement = "Your text to replace"; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(input, replacement); 

Regex kitaplığında, tek bir dizede birden çok değiştirmeye daha iyi uyum sağlayabilecek başka yöntemler de vardır.

+2

Bu durumda, regex aslında 'input''dur. – BoltClock

2

Sen normal ifadeler kullanabilirsiniz (yay, meta-regexes!):

public static string RegexInterp(Regex pattern, Dictionary<string, string> pairs) { 
    string regex = pattern.ToString(); 
    string search; 

    foreach(KeyValuePair<string, string> entry in pairs) 
    { 
     // using negative lookbehind so it doesn't match escaped parens 
     search = @"\(\?<" + entry.Key + @">.*?(?<!\\)\)"; 
     regex = Regex.Replace(regex, search, entry.Value); 
    } 

    return Regex.Unescape(unescaped); 
} 

Ve sonra:

Regex rx = new Regex(@"X(?<xid>\d\d+)-(?<xsub>\w+)\.xml"); 

var values = new Dictionary <string, string>() {{"xid", "999"}, 
               {"xsub", "baz"}} ; 

Console.WriteLine(RegexInterp(rx, values));  

Baskı

X999-baz.xml 

Demo: http://ideone.com/QwI2W

İlgili konular