多文本文件多行内容替换求助:用C#替换Synopsis后内容
需求与问题
我有多个文本文件,需要替换文件内指定字符串,每个文件中该内容最多重复500次。具体需求是:将所有书籍信息中Synopsis :后的全部内容替换为自定义字符串(如“暂无”)。我已实现文件读取功能,但尝试通过起始标记Synopsis :和结束标记Book number:完成替换的代码未生效。
书籍信息示例
List of all books Romance Book number: 1 Title : Something Title Author : Some Author ISBN: 45425425423 Written Date : Some date Release Date: Some date Characters: Blah Blah Genre: Romance Synopsis : Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Book number: 2 Title : Something Title Author : Some Author ISBN: 45425425423 Written Date : Some date Release Date: Some date Characters: Blah Blah Genre: Romance Synopsis : Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Book number: 3 Title : Something Title Author : Some Author ISBN: 45425425423 Written Date : Some date Release Date: Some date Characters: Blah Blah Genre: Romance Synopsis : Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Comedy Book number: 1 Title : Something Title Author : Some Author ISBN: 45425425423 Written Date : Some date Release Date: Some date Characters: Blah Blah Genre: Romance Synopsis : Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah
尝试的无效代码(C#)
string[] filelines = File.ReadAllLines(@"file.txt", Encoding.UTF8); string markS = "Synopsis :"; string MarkE = "Book number:"; for (int i = 0; i < fileLines.Length; i++) { string line = fileLines[i]; int start = line.IndexOf(markS); int end = line.LastIndexOf(MarkE); Console.WriteLine(start + " " + end); if (start >= 0 && end >= 0) { Console.WriteLine(line); int length = line.IndexOf(MarkE) + MarkE.Length - start; var textToReplace = line.Substring(start, length); string replacement = markS + replacedText + MarkE; var result = line.Replace(textToReplace, replacement); fileLines[i] = result; } File.WriteAllLines(@"test2.txt", fileLines); }
问题分析
原代码存在几个核心问题:
- 逐行处理逻辑错误:
Synopsis :和Book number:不在同一行,逐行查找永远无法同时匹配两个标记,替换逻辑根本不会触发。 - 变量未定义:代码中使用
replacedText变量但未声明赋值。 - 重复写入文件:循环内每次迭代都写入文件,效率低且可能写入中间错误状态。
- 边界处理遗漏:最后一本书的
Synopsis后没有Book number:标记,原代码无法处理这种情况。
正确实现方案
方案思路
将整个文件内容作为字符串读取,用正则表达式匹配Synopsis :到下一个Book number:(或文件末尾)的内容,统一替换为自定义字符串。正则可高效处理跨多行匹配,覆盖所有边界情况。
完整代码
using System; using System.IO; using System.Text.RegularExpressions; class Program { static void Main() { // 自定义替换文本 string replacedText = "暂无"; // 文件路径 string inputFilePath = @"file.txt"; string outputFilePath = @"test2.txt"; // 读取整个文件内容 string fileContent = File.ReadAllText(inputFilePath, Encoding.UTF8); // 正则匹配规则:匹配Synopsis : 到下一个Book number:或文件末尾的内容 string pattern = @"(?s)Synopsis :\s*(.*?)(?=Book number:|$)"; string replacement = $"Synopsis : {replacedText}\n\n"; // 执行替换,最多替换500次(符合需求) string newContent = Regex.Replace(fileContent, pattern, replacement, RegexOptions.None, TimeSpan.FromSeconds(1)); // 写入替换后的内容 File.WriteAllText(outputFilePath, newContent, Encoding.UTF8); Console.WriteLine("替换完成"); } }
代码说明
- 读取方式优化:用
File.ReadAllText读取整个文件,避免逐行处理的局限性。 - 正则逻辑解析:
(?s):启用单行模式,让.可匹配换行符,支持跨多行匹配Synopsis内容。Synopsis :\s*:匹配起始标记,\s*吃掉标记后的所有空白(包括换行)。(.*?):非贪婪匹配,确保只匹配到下一个Book number:或文件末尾,避免过度匹配。(?=Book number:|$):正向预查,作为匹配结束边界,不包含Book number:本身。
- 替换控制:
Regex.Replace默认会替换所有匹配项,若需明确限制最多500次,可添加参数500。 - 输出处理:统一写入文件,避免循环内重复写入的问题。
批量处理多个文件
若需处理目录下多个文本文件,可添加遍历逻辑:
string directoryPath = @"your_directory_path"; string[] textFiles = Directory.GetFiles(directoryPath, "*.txt"); string pattern = @"(?s)Synopsis :\s*(.*?)(?=Book number:|$)"; string replacement = $"Synopsis : 暂无\n\n"; foreach (string filePath in textFiles) { string fileContent = File.ReadAllText(filePath, Encoding.UTF8); string newContent = Regex.Replace(fileContent, pattern, replacement, RegexOptions.None, TimeSpan.FromSeconds(1)); // 可覆盖原文件或写入新文件 File.WriteAllText(filePath, newContent, Encoding.UTF8); }
内容的提问来源于stack exchange,提问作者Tpd
相关产品推荐
相关产品推荐

