在循环中替换字符串

时间:2014-01-13 20:23:24

标签: c# string

我正在使用剃刀页面,我需要从变量属性表中删除一系列自定义字段。我的目的是用htmlstring替换特定的符号配对('{}')。然而,为了简化,我想用增量号替换它。

这是我正在寻找的伪代码。

string s = "This sample will count: {}, {}, {}."
int i = 0;
while(*string not finished*)//?
{ 
   i ++;
   s.Replace("{}", i);  
}

输出:

"This sample will count 1, 2, 3."

这是我需要使用正则表达式吗?还有其他想法吗?

修改

我应该澄清一下:直到运行时我才知道有多少'{}。这些数字可能会让人失望,我更喜欢做更类似的事情:

 s.replace("{}", stringArray[i]);

5 个答案:

答案 0 :(得分:3)

使用Split来标记输入字符串的简单示例;

string s = "This sample will count: {}, {}, {}.";
string[] tokens = s.Split(new[] { "{}"}, StringSplitOptions.None);
StringBuilder sb = new StringBuilder();

int counter = 1;
for (int i = 0; i < tokens.Length; i++ )
{
    sb.Append(tokens[i]);
    if (i < tokens.Length - 1)
        sb.Append(counter++);
}

Console.WriteLine(sb.ToString());

解决您发布的示例,但我认为您的实际要求会稍微复杂一些。

答案 1 :(得分:2)

您可以使用正则表达式match evaluator,如下所示:

var re = new Regex(@"\{\}");

string s = "This sample will count: {}, {}, {}.";

string[] replacementStrings = new string[]{"r1", "r2", "r3"};

int i = 0;

string n = re.Replace(s, m => 
    {
        return replacementStrings[i++];
    }); 

Console.WriteLine(n); // outputs: This sample will count: r1, r2, r3.

答案 2 :(得分:1)

如果性能对您很重要,请手动遍历字符串并将其内容写入StringBuilder(以防止在连接和替换字符串时进行大量字符串实例创建),然后查找并替换{{1 }}。 {}会很好用。完成后,缓存结果并通过string.IndexOf

输出字符串构建器

答案 3 :(得分:0)

您可以使用普通的旧字符串操作来执行此操作:

string s = "This sample will count: {}, {}, {}.";
string[] stringArray = new[] { "1", "2", "3" };
int i = 0, c = s.IndexOf("{}");
while(c >= 0)
{
    s = s.Remove(c) + stringArray[i++] + s.Substring(c + 2);  
    c = s.IndexOf("{}");
}
// s == "This sample will count: 1, 2, 3."

或使用正则表达式:

string s = "This sample will count: {}, {}, {}.";
string[] stringArray = new[] { "1", "2", "3" };
int i = 0;
s = Regex.Replace(s, "{}", m => stringArray[i++]);
// s == "This sample will count: 1, 2, 3."

或使用Linq:

string s = "This sample will count: {}, {}, {}.";
string[] stringArray = new[] { "1", "2", "3" };
s = String.Join("", s.Split(new[]{ "{}" }, StringSplitOptions.None)
                     .Select((x, i) => i < stringArray.Length ? x + stringArray[i] : x));
// s == "This sample will count: 1, 2, 3."

答案 4 :(得分:-1)

另一种解决方案:

string fmt = "This sample will count: {0}, {1}, {2}.";
int[] values = new int[3];
for (int i = 0; i < values.Length; i++) {
  values[i] = i;
}
string s = string.Format(fmt, values[0], values[1], values[2]);

这对您发布的内容采用了不同的逻辑方法,可能适用于您的项目,也可能不适用。