用c#中列表中的连续元素替换字符串占位符



我知道有人问过类似的问题,但我找不到任何特别适合我需要的东西,我对Regex一无所知。

我有不同长度的句子,像这样:

提供一个+$modifier%的最大质量加成和一个+$modifier%的特殊特质的几率当开发一个配方。

使得$修饰符是所有这些的占位符。我有一个浮点数列表,然后我将根据顺序替换它们。

在本例中,我有一个List值{5,0.5}。被替换的字符串应该以

结尾提供+5%的最高品质加值和+0.5%的特殊特质在开发配方时。

我想避免使用string。替换文本可能会变长,我不想在它上面循环多次。有谁能提出一个好的方法吗?

谢谢H

方法Regex.Replace有一个重载,您可以指定一个回调方法来提供每个替换使用的值。

private string ReplaceWithList(string source, string placeHolder, IEnumerable<object> list)
{
// Escape placeholder so that it is a valid regular expression
placeHolder = Regex.Escape(placeHolder);
// Get enumerator for list
var enumerator = list.GetEnumerator();
// Use Regex engine to replace all occurences of placeholder
// with next entry from enumerator
string result = Regex.Replace(source, placeHolder, (m) => 
{
enumerator.MoveNext();
return enumerator.Current?.ToString();
});
return result;
}

像这样使用:

string s = "Provides a +$modifier% bonus to Maximum Quality and a +$modifier% chance for Special Traits when developing a Recipe.";
List<object> list = new List<object> { 5, 0.5 };
s = ReplaceWithList(s, "$modifier", list);

请注意,您需要添加合理的错误处理。

由于字符串在CLR中是不可变的,因此可能没有明智的方法可以分割字符串并以某种方式将其重新组合在一起。

一种方法是分割你想要的标记字符串,插入你的替换值,然后再次连接你的部分:

var s = "Provides a +$modifier % bonus to Maximum Quality and a +$modifier % chance for Special Traits when developing a Recipe.";
var v = new List<float> { 5.0f, 0.5f };
var result = string.Concat(s.Split("$modifier").Select((s, i) => $"{s}{(i < v.Count ? v[i] : string.Empty)}"));

相关内容

  • 没有找到相关文章

最新更新