2012-03-23 162 views
1

什麼是在字符串中查找子字符串(模板)並在模板的字母大小寫後用其他字符替換的最簡單快速的方法(如果全部小寫 - 用小寫,如果全部大寫 - 用大寫字母代替,如果用大寫字母開始,等...)查找子字符串,根據情況替換子字符串

所以如果子是在大括號

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

如果不是所有的字符/下限 - 只是跳過串occurence? – sll 2012-03-23 20:33:20

+0

如果模板設置爲「駱駝案例」時尚,只需通過檢查前兩個字母來確定其餘部分......哦,geee ......我只是意識到 - 任何時候它只取決於一對前導字母 – Agzam 2012-03-23 20:35:27

+0

這些只是4個案例嗎?或者你有更多的,例如'{tEmPlAte}',等等? – code4life 2012-03-23 20:39:31

回答

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

您可以檢查前兩個的情況下,佔位符的字母,併爲插入的文本選擇四種格式轉換策略之一。

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 2012-03-23 20:39:46

+0

@Agzam 4 if語句... – Servy 2012-03-23 20:43:09

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

而且你的評價回調會做這樣的事情正則表達式匹配值,你可以做一個區分大小寫的比較並返回正確的替換值。

編輯我覺得你試圖找到一個文本塊中的佔位符,而不是擔心外殼本身,如果你的模式一直有效,那麼你可以檢查前兩個字符佔位符本身會告訴你,你需要在替換表達式中使用的外殼:

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。我認爲這個解決方案是過度的。什麼保證正則表達式和回調的使用 - 不是一個簡單的if語句和a.Replace方法就足夠了嗎? – 2012-03-23 20:53:48