如何在c#中用动态值替换字符串?

时间:2016-09-20 07:55:00

标签: c# .net

我有这段代码:

string a = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa";
//MustbeReplaced should be Replaced1, Replaced2, and so on
a = a.Replace("MustbeReplaced", "Replaced"); 

每次有字符串替换时,我想用动态值替换它。例如,上面字符串的输出应为:

"**Replaced1**asdgasfsff**Replaced2**asdfafasfsa"

我知道String.Replace,但据我所知,这只是替换静态String

有没有办法做到这一点?

5 个答案:

答案 0 :(得分:5)

您可以使用Regex类并提供每次匹配将被调用一次的委托。它需要返回字符串以将匹配的文本替换为。

您只需声明一个包含计数器的变量:

string a = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa";
int replacementIndex = 0;
string b = Regex.Replace(a, "MustbeReplaced", match =>
{
    replacementIndex++;
    return $"Replaced{replacementIndex}";
});

运行此功能后,b将包含以下内容:

**Replaced1**asdgasfsff**Replaced2**asdfafasfsa

警告:由于您现在正在使用Regex课程,请注意Regex将用于增强模式的所有特殊字符逐字符匹配。如果你要替换包含星号,问号,括号等符号的文本,那么你需要逃避它们。

幸运的是,我们可以简单地要求Regex班级为我们这样做:

string a = "**Mustbe?Replaced**asdgasfsff**Mustbe?Replaced**asdfafasfsa";
int replacementIndex = 0;
string b = Regex.Replace(a, Regex.Escape("Mustbe?Replaced"), match =>
{
    replacementIndex++;
    return $"Replaced{replacementIndex}";
});

答案 1 :(得分:2)

使用Regex.Replace(String, MatchEvaluator)重载。 corresponding MSDN page包含一个几乎完全符合您要求的示例。

这是一个更简单的例子:

var input = "MustBeReplaced A MustBeReplaced B";

int i = 1;
MatchEvaluator evaluator = (m) => "Replaced " + (i++);

// yields Replaced 1 A Replaced 2 B
var result = Regex.Replace(input, "MustBeReplaced", evaluator);

答案 2 :(得分:1)

您可以使用已经显示的正则表达式,也可以使用这种更有效但可读性更低的纯字符串方法方法:

string a = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa";
int matchCount = 0, index = 0;
while ((index = a.IndexOf("MustbeReplaced", index, StringComparison.Ordinal)) >= 0)
{
    a = a.Remove(index, "MustbeReplaced".Length).Insert(index, "Replaced" + ++matchCount);
}

答案 3 :(得分:0)

可以这样做:

        string source = "**MustbeReplaced**asdgasfsff**MustbeReplaced**asdfafasfsa";
        int count = 0;
        var result = Regex.Replace(source, "MustbeReplaced", m => "Replaced" + (++count));

答案 4 :(得分:0)

想要避免正则表达式?想要更多表现吗?使用此代码。 此代码仅使用一次StringBuilder。

    public static string ReplaceWithNumberPrefix(this string source, string oldString, string newString, int numberPrefixStart)
    {
        var oldStringLength = oldString.Length;

        var indexes = new List<int>();
        var p = source.IndexOf(oldString);                    
        if (p >= 0)
            do
            {
                indexes.Add(p);
                p = source.IndexOf(oldString, p + 1);                    
            } while (p >= 0);

        var builder = new System.Text.StringBuilder(source);
        var trailingDifference = 0;
        for (int i = 0; i < indexes.Count; i++)
        {
            var replacement = string.Concat(newString, numberPrefixStart);
            var startIndex = indexes[i] + trailingDifference;
            builder.Replace(oldString, replacement, startIndex, oldStringLength);

            numberPrefixStart++;
            trailingDifference = trailingDifference + replacement.Length - oldStringLength;
        }

        return builder.ToString();
    }