【问题标题】:Loop through all of the occurrences of a certain string and replace each with a different value in C#?循环遍历某个字符串的所有出现并在 C# 中用不同的值替换每个字符串?
【发布时间】:2020-11-14 23:39:51
【问题描述】:

我有一个大文本字符串(它是一个源代码),我需要遍历某个字符串的出现次数(可能出现在随机数量的地方),并将它们中的每一个替换为不同的值,我不能使用 Replace() 函数,因为它会用唯一值替换所有这些函数。

例如这个文本字符串:

REPLACE_ME

REPLACE_ME

REPLACE_ME

需要转换成这个:

RAND_STRING1

RAND_STRING2

RAND_STRING3

我一次阅读了整个文本,并且已经将它保存在一个字符串变量中。

【问题讨论】:

  • 您是使用TextReader 分块阅读文本还是一次性阅读?
  • @aybe 一下子,我已经把它放在了一个字符串变量中。
  • 这能回答你的问题吗? C# Replace + different number each replace
  • 这些“如何做”的问题和答案正是本网站所需要的,前提是它们的范围受到足够的限制(这就是)。
  • @CamiloTerevinto 哎呀!用, 可能会读得更好哈哈。

标签: c#


【解决方案1】:

Regex.Replace() 接受 MatchEvaluator 委托,您可以使用它完成您想要的:

var input = "REPLACE_ME REPLACE_ME REPLACE_ME";

var substring = Regex.Escape("REPLACE_ME");
var substitute = "VALUE";
var counter = 1;

var result = Regex.Replace(input, substring, (m) => $"{prefix}{counter++}");

result 的值将是 "VALUE1 VALUE2 VALUE3"

Regex.Escape() 调用对于这个特定示例来说是多余的("REPLACE_ME" 不包含任何需要转义的特殊字符),但我建议养成转义文字子字符串的习惯——尤其是如果你想接受用户提供的输入!

当然,你可以在评估器中做任何你想做的事情:

var random = new Random();
var result = Regex.Replace(input, substring, (m) => random.Next().ToString());
// or
var result = Regex.Replace(input, substring, (m) => {
    var randomString = someAPIClient.GetRandomValueFromRandomValueService();
    var encoded = Encoding.UTF8.GetBytes(randomString);
    return Convert.ToBase64String(encoded);
});

你的想象力在这里设定了限制:)

【讨论】:

  • 是 C# 9 还是 C# 8?我的意思是你使用了 lambda 表达式(m) =>
  • @Bigeyes:lambda 表达式是引用的Regex.Replace 重载所需的 MatchEvaluator 委托的替代。它不需要 C# 9。请参阅 stackoverflow.com/a/31326693
  • 我很确定它早在 C# 3/.NETFX 3.5 就可以工作(使用 lambda):)
【解决方案2】:

正则表达式示例:

string[] textFile = File.ReadAllLines("myFile.txt");
var i = 0;
//Stringbuilder will be the contents of our new text file.
StringBuilder sb = new StringBuilder();
//iterate through each line, making our replacements and appending to the string builder
foreach (string line in textFile)
{
    var result = Regex.Replace(
                 line, "REPLACE_ME", m => string.Format("{0}{1}",m.Value,++i), RegexOptions.IgnoreCase);
    sb.AppendLine(result);
}
//Write to new file like so:
StreamWriter sw = new StreamWriter("newFile.txt");
sw.Write(sb.ToString()));
sw.Close();

【讨论】:

    【解决方案3】:

    你需要逐行遍历文件。 保持找到 nr 个实例的计数器。

    如果当前行包含您的 REPLACE_ME 字符串,则将该字符串替换为您的随机字符串并附加计数器值,更新计数器 + 1 并继续执行下一行。

    结果将是您的 replace_me 的每个实例都将被替换为唯一值。

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 2016-01-07
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多