查找子字符串,根据具体情况替换子字符串

时间:2012-03-23 20:31:27

标签: c#

在字符串中查找子字符串(模板)的最简单,最快捷的方法是将其替换为模板字母大小写之后的其他内容(如果全部小写 - 替换为小写,如果全部大写 - 替换为大写字母,如果以大写开头等等......)

所以如果子串是大括号

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

3 个答案:

答案 0 :(得分:1)

好吧,您可以使用正则表达式和匹配评估程序回调,如下所示:

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

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

你的评估者回调会做这样的事情:

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

获得正则表达式匹配值后,您只需进行区分大小写的比较并返回正确的替换值。

编辑我有点假设你试图在一个文本块中找到占位符,而不是担心外壳本身,如果你的模式一直有效,那么你可以检查一下占位符本身的前两个字符,它将告诉您需要在替换表达式中使用的大小写:

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

我仍然会使用正则表达式来匹配替换占位符,但那只是我。

答案 1 :(得分: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"}}));
}

答案 2 :(得分: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());
}