2012-03-23 14 views
1

ストリング内のサブストリング(テンプレート)を見つけて、それをテンプレートの大文字小文字の後に置き換えるのが最も簡単で最も速い方法ですすべて大文字であれば小文字、 - ように大文字とで始まる場合、サブストリングは、中括弧内にある場合サブストリングを検索し、ケースに応じてサブストリングを置き換えます。

"{template}" becomes "replaced content" 
"{TEMPLATE}" becomes "REPLACED CONTENT" and 
"{Template}" becomes "Replaced content" but 
"{tEMPLATE}" becomes "rEPLACED CONTENT" 
+1

ではなく、すべての文字が下限/上限の場合は - ちょうど発生をサブストリングスキップ? – sll

+0

テンプレートが「キャメルケース」に設定されていれば、最初の2文字を調べて残りの部分を判断する...ああ...私はちょうど実現しました - いつでもそれは先行文字のペアに依存します – Agzam

+0

これらは唯一の4ケースですか?あるいは、例えば '{tEmPlAte}'などのようなものがありますか? – code4life

答えて

0

public static string ReplaceWithTemplate(this string original, string pattern, string replacement) 
{ 
    var template = Regex.Match(original, pattern, RegexOptions.IgnoreCase).Value.Remove(0, 1); 
    template = template.Remove(template.Length - 1); 
    var chars = new List<char>(); 
    var isLetter = false; 
    for (int i = 0; i < replacement.Length; i++) 
    { 
    if (i < (template.Length)) isLetter = Char.IsUpper(template[i]); 
    chars.Add(Convert.ToChar(
         isLetter ? Char.ToUpper(replacement[i]) 
           : Char.ToLower(replacement[i]))); 
    } 

    return new string(chars.ToArray()); 
} 
0

あなたが最初の二つのケースを確認することができますので、...、大文字で)

を置き換えますプレースホルダーの文字を入力し、挿入されたテキストの4つのケース変換戦略のうちの1つを選択します。あなたが得れば

private string EvaluateMatchCallback(Match match) { 
    string templateInsert = match.Groups["value"].Value; 
    // or whatever 
    string replacedText = GetReplacementTextBasedOnTemplateValue(templateInsert); 
    return replacedText; 
} 

:このような何かをするだろう

regex = new Regex(@"\{(?<value>.*?)\}", 
    RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture); 

string replacedText = regex.Replace(<text>, 
    new MatchEvaluator(this.EvaluateMatchCallback)); 

そして、あなたの評価コールバック:

public static string Convert(string input, bool firstIsUpper, bool restIsUpper) 
{ 
    string firstLetter = input.Substring(0, 1); 
    firstLetter = firstIsUpper ? firstLetter.ToUpper() : firstLetter.ToLower(); 
    string rest = input.Substring(1); 
    rest = restIsUpper ? rest.ToUpper() : rest.ToLower(); 
    return firstLetter + rest; 
} 

public static string Replace(string input, Dictionary<string, string> valueMap) 
{ 
    var ms = Regex.Matches(input, "{(\\w+?)}"); 
    int i = 0; 
    var sb = new StringBuilder(); 
    for (int j = 0; j < ms.Count; j++) 
    { 
     string pattern = ms[j].Groups[1].Value; 
     string key = pattern.ToLower(); 
     bool firstIsUpper = char.IsUpper(pattern[0]); 
     bool restIsUpper = char.IsUpper(pattern[1]); 
     sb.Append(input.Substring(i, ms[j].Index - i)); 
     sb.Append(Convert(valueMap[key], firstIsUpper, restIsUpper)); 
     i = ms[j].Index + ms[j].Length; 
    } 

    return sb.ToString(); 
} 

public static void DoStuff() 
{ 
    Console.WriteLine(Replace("--- {aAA} --- {AAA} --- {Aaa}", new Dictionary<string,string> {{"aaa", "replacement"}})); 
} 
+0

さて、それをエレガントなコードスニペットで包む方法を教えてください。 – Agzam

+0

@Agzam 4 if文... – Servy

1

さて、あなたは正規表現と、このような一致評価コールバックを使用することができます正規表現のマッチ値を使用すると、大文字と小文字を区別した比較を行い、正しい置換値を返すことができます。

EDIT私は一種のあなたがテキストのブロック内のプレースホルダを見つけるのではなく、あなたのパターンは、その後、あなただけの最初の2つの文字を確認することができ、すべての時間有効であれば、それ自体がケーシングを心配しようとしていたと仮定しましたプレースホルダ自体、それはあなたが交換式で使用する必要がケーシング教えてくれます:私はまだ交換用のプレースホルダにマッチする正規表現を使用しますが、それは私だけだ

string foo = "teMPLATE"; 
if (char.IsLower(foo[0])) { 
    if (char.IsLower(foo[1])) { 
     // first lower and second lower 
    } 
    else { 
     // first lower and second upper 
    } 
} 
else { 
    if (char.IsLower(foo[1])) { 
     // first upper and second lower 
    } 
    else { 
     // first upper and second upper 
    } 
} 

を。それをやってしまった

+0

-1。私はこの解決法を過度のものと考えています。正規表現とコールバックの使用を保証するものは、文とa.Replaceメソッドで十分です。 –

関連する問題