2011-09-08 1 views
5

私は通常、正規表現を解析してその値をその捕捉グループに補間するための条件やループをたくさん作成し、うまく簡単にこの問題を解決するための経験豊富な答えを探しています。例えばRegexパターンに値を補間して文字列を作成する最も簡単な方法は?

X(?<xid>\d+)-(?<xsub>\w+)\.xmlような正規表現パターンは、名前付き捕捉基を有する所与 "XID" などのファイル名と一致することを意図し、 "XSUB":X1-foo.xmlを、X555-bar.xmlなどの引数で提供された場合、:int xid=999, string xsub="baz"、私は適切なファイル名を構築するために、パターングループにそれらの値を補間したい:X999-baz.xml

をシンプルに保つために、明示的なキャプチャは、ネストされていません。 String.Formatのなし


この概念は簡単String.Format("X{0}-{1}.xml", xid, xsub)などの.NET文字列の書式項目で達成されるが、私はすでに任意のファイル名の文字列からそれらの値を解析するための正規表現パターンを持っている、としたいです同じパターンを使用してファイル名を再構成して反対方向に進み、正確にします。文字列の値を解析するための正規表現パターンが必要ですが、ファイル名を再構成するためにフォーマット項目を含む文字列を使用するには、2種類の異なる構文を使用する必要があります。誤って正規表現のパターンマッチの結果を正しく再構成しない不正な形式の項目文字列を作成したり、その逆もあります。

答えて

0

これは間違っているかもしれませんが、System.Text.RegularExpressions名前空間にRegex.Replaceメソッドが必要なように聞こえるかもしれません。

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

regexライブラリには、1つの文字列内に複数の置換文字をうまく扱う方法があります。

+2

をこの状況では、正規表現は実際には 'input'です。 – BoltClock

2

あなたは正規表現を使用することができます(イェーイ、メタ正規表現を!):

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

そして:

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

プリント

X999-baz.xml 

デモ:http://ideone.com/QwI2W

関連する問題