我有这段代码:
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
。
有没有办法做到这一点?
答案 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();
}