2011-09-08 1 views
5

Io di solito finiscono con un sacco di condizioni e/o loop per analizzare una regex e interpolare i valori di nuovo nei suoi gruppi di cattura, e sono alla ricerca di risposte con esperienza per risolvere questo problema in auspicabilmente, un modo semplice.modo più semplice per costruire una stringa interpolando i valori in un modello Regex?

Ad esempio, dato un modello di espressione regolare come X(?<xid>\d+)-(?<xsub>\w+)\.xml avere i gruppi di cattura denominata "xid" e "XSUB", destinati per abbinare i nomi di file come: X1-foo.xml, X555-bar.xml, ecc, ove previsto con gli argomenti: int xid=999, string xsub="baz", voglio interpolare questi valori nei gruppi del modello per costruire il corretto nome del file: X999-baz.xml

per farla semplice, cattura espliciti non sono annidati.


Senza String.Format:

Questo concetto è facilmente realizzabile con gli elementi di formato .NET stringa come String.Format("X{0}-{1}.xml", xid, xsub) però ho già un modello Regex per analizzare fuori quei valori da qualsiasi stringa nome del file, e vogliono usare lo stesso modello per andare nella direzione opposta ricostruendo un nome di file con esso, per precisione. Se ho bisogno di un modello di espressione regolare per analizzare i valori da una stringa, ma una stringa con gli oggetti in formato di ricostruire il nome del file, esso richiede due tipi di sintassi distinti da utilizzare, la creazione di una maggiore possibilità di errori manuali durante la scrittura loro - è troppo facile erroneamente creare una stringa elemento formato male che non ricostruire correttamente il risultato di una partita espressione regolare, o viceversa.

risposta

0

forse ho letto questo sbagliato, ma suona come è necessario il metodo Regex.Replace nello spazio dei nomi System.Text.RegularExpressions.

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

Esistono altri metodi nella libreria regex che potrebbero adattarsi meglio a più sostituzioni in una singola stringa.

+2

In questa situazione, la regex è in effetti l '"input". – BoltClock

2

È possibile utilizzare regex (yay, meta-regex!):

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

E poi:

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

Stampe

X999-baz.xml 

Demo: http://ideone.com/QwI2W