C# Regex replace-如何用不同的字符串替换多个位置中的相同模式?

C# Regex replace-如何用不同的字符串替换多个位置中的相同模式?,c#,regex,C#,Regex,我有一个特别的问题 我有一个字符串,它在多个步中具有某个常量值。例如,考虑下面的刺痛。 string tmpStr = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?" 现在我想用存储在数组中的值替换字符串中的每个tmp,第一个tmp保存数组[0],第二个tmp保存数组[1],依此类推 你知道如何做到这一点吗。。?我使用C#2.0您可以使用MatchEvaluator(调用该函数来执行每次替换),这里有一些示例: 建议,您可以使用

我有一个特别的问题

我有一个字符串,它在多个步中具有某个常量值。例如,考虑下面的刺痛。

string tmpStr = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?"
现在我想用存储在数组中的值替换字符串中的每个tmp,第一个tmp保存数组[0],第二个tmp保存数组[1],依此类推


你知道如何做到这一点吗。。?我使用C#2.0

您可以使用MatchEvaluator(调用该函数来执行每次替换),这里有一些示例:


建议,您可以使用string.Split()在“tmp”上进行拆分。然后迭代拆分项目的列表,并将它们+数组值打印出来,例如仅使用伪代码idea

string[] myarray = new string[] { 'val1', 'val2' };
string s = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#";
string[] items = s.Split("tmp");
for (int i = 0; i < items.Length; i++)
{
    Console.WriteLine(parts[i] + myarray[i] ) ;
}
string[]myarray=新字符串[]{'val1','val2'};
string s=“Hellotmp这怎么可能在C”中;
字符串[]项=s.Split(“tmp”);
对于(int i=0;i
这个怎么样:

string input = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?";
string[] array = { "value1", "value2", "value3" };

Regex rx = new Regex(@"\b_tmp_\b");

if (rx.Matches(input).Count <= array.Length)
{
    int index = 0;
    string result = rx.Replace(input, m => array[index++]);
    Console.WriteLine(result);
}

我认为Ahmad Mageed的第一个解决方案是值得采用的,因为数组[index++]在传递到rx.Replace方法时只计算一次

我也编译了它,以验证我是否正确理解了它,并且确信它会生成以下输出:

你好value1 value1怎么样 C#……中可能的值1

随着框架的更新版本,行为是否发生了变化?还是我错误地认为预期产出应该是:

你好value1 value2怎么样 C#中的可能值3


向你致敬。。和我想要的完全一样。但是它是如何工作的呢?您有一个lambda表达式m=>array[index++],它是如何起作用的?@Amit:lambda或匿名委托取代了
MatchEvaluator
。找到的每个匹配项都将替换为数组的一个元素。因此,第一个匹配将替换为数组[0],然后
index++
index
设置为1,然后下一个匹配将前进到数组[1]的值,依此类推。@Ahmad:非常感谢。。让我在同一个平台上探索更多内容。。!我的机器上安装了3.5框架,lambda表达式在指向2.0框架的项目上运行良好@艾米特:马丁·布斯在下面的帖子中提出了一个非常好的观点。委托的真正原因是捕获
索引
变量,以便为每个匹配正确地推进该变量。如果我单独使用
array[index++]
,那么它会计算一次,并重复使用
value1
,这与问题的目的相反。您可能想参考Jon Skeet关于闭包的文章了解更多详细信息:@Ahmaged,只有一个问题。您确定您提供的
MatchEvaluator
中的匹配项枚举顺序从左到右都很严格吗?换句话说,例如,如果委托方法将调用第二个匹配,然后调用第一个匹配,该怎么办。在这种假设情况下,将不正确地进行更换。我知道从左到右的流程对于regex实现是很常见的,但是,如果?如果你有任何链接,可以消除我的疑虑,你可以提供他们。+1给你,很好的一点。你完全正确,现在已经太迟了:)我的第一个解决方案有效,因为索引是一个捕获的值。马丁:你的期望是正确的。这与我原来的答案相符。如果我直接使用
array[index++]
的话,框架中的行为是不变的,就像我在回卷答案之前所做的那样。这确实一次又一次地给出了值1。第二种方法之所以有效,是因为代理捕获了
索引
变量。有关更多信息,请参阅Jon Skeet关于闭包的文章:
string result = rx.Replace(input, delegate(Match m) { return array[index++]; });