Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环遍历某个字符串的所有匹配项,并用C#中的不同值替换每个字符串?_C# - Fatal编程技术网

循环遍历某个字符串的所有匹配项,并用C#中的不同值替换每个字符串?

循环遍历某个字符串的所有匹配项,并用C#中的不同值替换每个字符串?,c#,C#,我有一个大的文本字符串(它是一个源代码),我需要循环某个字符串的出现(可能出现在随机数个位置),并用不同的值替换每个字符串,我不能使用replace()函数,因为它会用唯一的值替换所有字符串 例如,这个文本字符串: REPLACE_ME REPLACE_ME REPLACE_ME 需要转换为以下格式: RAND_STRING1 RAND_STRING2 RAND_STRING3 我一次读取了整个文本,并且已经将其保存在字符串变量中。您需要逐行遍历文件。 保留找到的nr实例的计数器 如

我有一个大的文本字符串(它是一个源代码),我需要循环某个字符串的出现(可能出现在随机数个位置),并用不同的值替换每个字符串,我不能使用replace()函数,因为它会用唯一的值替换所有字符串

例如,这个文本字符串:

REPLACE_ME

REPLACE_ME

REPLACE_ME
需要转换为以下格式:

RAND_STRING1

RAND_STRING2

RAND_STRING3

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

您需要逐行遍历文件。 保留找到的nr实例的计数器

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

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

接受一个
匹配评估器
委托,您可以使用该委托完成所需的操作:

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++}");
结果的值
将是
的“值1值2值3”

对于这个特定的示例,
Regex.Escape()
调用是多余的(
“REPLACE\u ME”
不包含任何需要转义的特殊字符),但我建议不管怎样都要养成转义文字子字符串的习惯-尤其是如果您想要接受用户提供的输入

当然,您可以在evaluator中执行任何您想执行的操作:

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);
});
你的想象力在这里设定了极限:)

正则表达式示例:

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();

你是用
TextReader
逐块阅读文本还是一次阅读全部文本?@aybe一次阅读全部文本,我已经把它放在一个字符串变量中了。这能回答你的问题吗?这些“如何”的问题和答案正是这个网站所需要的,只要它们在范围上受到足够的限制(这是一个)。@camiloterevento哎呀!如果里面有一个
,可能会读得更好。哈哈。是C#9还是C#8?我的意思是您使用了lambda表达式
(m)=>
@bighees:lambda表达式是引用的
正则表达式所需的MatchEvaluator委托的替代项。Replace
重载。它不需要C#9。请看,我非常确定它(与lambda一起)在C#3/.NETFX 3.5:)之前就可以工作了