如何按模式重写字符串

时间:2012-07-12 10:15:27

标签: c# string iterator string-formatting

我有一个字符串,其中“特殊区域”用大括号括起来:

{intIncG}/{intIncD}/02-{yy}

我需要在{}之间迭代所有这些元素,并根据它们的内容替换它们。在C#中使用它的最佳代码结构是什么?

我不能只进行替换,因为我需要知道每个“speacial area {}”的索引,以便用正确的值替换它。

4 个答案:

答案 0 :(得分:2)

string.Replace会做得很好。

var updatedString = myString.Replace("{intIncG}", "something");

为每个不同的字符串做一次。


更新

由于您需要{的索引才能生成替换字符串(与commented一样),因此您可以使用Regex.Matches 查找索引{ - Matches集合中的每个Match对象都将包含字符串中的索引。

答案 1 :(得分:2)

Regex rgx = new Regex( @"\({[^\}]*\})");
string output = rgx.Replace(input, new MatchEvaluator(DoStuff));


static string DoStuff(Match match)
{
//Here you have access to match.Index, and match.Value so can do something different for Match1, Match2, etc.
//You can easily strip the {'s off the value by 

   string value = match.Value.Substring(1, match.Value.Length-2);

//Then call a function which takes value and index to get the string to pass back to be susbstituted

}

答案 2 :(得分:0)

使用Regex.Replace

  

将所有出现的正则表达式定义的字符模式替换为指定的替换字符串。

来自msdn

答案 3 :(得分:0)

您可以定义一个函数并加入它的输出 - 因此您只需要遍历一次部分而不是每个替换规则。

private IEnumerable<string> Traverse(string input)
{
  int index = 0;
  string[] parts = input.Split(new[] {'/'});
  foreach(var part in parts)
  {
    index++;
    string retVal = string.Empty;
    switch(part)
    {
      case "{intIncG}":
        retVal = "a"; // or something based on index!
        break;
      case "{intIncD}":
        retVal = "b"; // or something based on index!
        break;

      ...
    }
    yield return retVal;
  }
}

string replaced = string.Join("/", Traverse(inputString));