2011-09-08 10 views
5

Zwykle kończę z wieloma warunkami i/lub pętlami, aby przeanalizować wyrażenie regularne i interpolować wartości z powrotem w grupy przechwytujące i szukam doświadczonych odpowiedzi, aby rozwiązać ten problem, miejmy nadzieję, w prosty sposób.Najprostszy sposób na skonstruowanie łańcucha przez interpolację wartości do wzoru Regex?

Na przykład, biorąc pod uwagę regex wzór jak X(?<xid>\d+)-(?<xsub>\w+)\.xml mający nazwanych grup przechwytywania "XID" i "XSUB", którego celem jest dopasować nazwy plików, takich jak: X1-foo.xml, X555-bar.xml, etc, gdy dostarczane z argumentami: int xid=999, string xsub="baz", chcę interpolacji te wartości do wzoru grup do skonstruowania właściwego pliku: X999-baz.xml

zachować to proste, wyraźne zrzuty nie są zagnieżdżone.


Bez String.Format:

Koncepcja ta jest łatwo zrobić z elementów wielkoformatowych NET Smyczkowych jak String.Format("X{0}-{1}.xml", xid, xsub) jednak mam już regex wzór do analizowania z tych wartości z dowolnego ciągu znaków nazwy pliku, a chcesz użyć tego samego wzoru, aby przejść w przeciwnym kierunku, rekonstruując z nim nazwę pliku, dla dokładności. Jeśli potrzebuję wzorca regex do analizowania wartości z łańcucha, ale ciąg z elementami formatu służącymi do rekonstrukcji nazwy pliku, wymaga użycia dwóch rodzajów odrębnych składni, co stwarza większe prawdopodobieństwo ręcznego błędu podczas ich zapisywania - jest to zbyt łatwe omyłkowo utwórz ciąg o złym formacie, który nie rekonstruuje prawidłowo wyniku dopasowania wzorca regex lub odwrotnie.

Odpowiedz

0

Prawdopodobnie przeczytałem to źle, ale wygląda na to, że potrzebujesz metody Regex.Replace w przestrzeni nazw System.Text.RegularExpressions.

Istnieją inne metody w bibliotece regex, które mogą lepiej pomieścić wiele zamienników w jednym ciągu.

+2

W tej sytuacji wyrażenie regularne jest w rzeczywistości "wejściem". – BoltClock

2

Można użyć wyrażenia regularnego (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); 
} 

, a następnie:

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));  

Drukuje

X999-baz.xml 

Demo: http://ideone.com/QwI2W