あなたが最初の二つのケースを確認することができますので、...、大文字で)
を置き換えますプレースホルダーの文字を入力し、挿入されたテキストの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"}}));
}
ではなく、すべての文字が下限/上限の場合は - ちょうど発生をサブストリングスキップ? – sll
テンプレートが「キャメルケース」に設定されていれば、最初の2文字を調べて残りの部分を判断する...ああ...私はちょうど実現しました - いつでもそれは先行文字のペアに依存します – Agzam
これらは唯一の4ケースですか?あるいは、例えば '{tEmPlAte}'などのようなものがありますか? – code4life