2012-03-23 176 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