You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多文本文件多行内容替换求助:用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("替换完成");
    }
}

代码说明

  1. 读取方式优化:用File.ReadAllText读取整个文件,避免逐行处理的局限性。
  2. 正则逻辑解析:
    • (?s):启用单行模式,让.可匹配换行符,支持跨多行匹配Synopsis内容。
    • Synopsis :\s*:匹配起始标记,\s*吃掉标记后的所有空白(包括换行)。
    • (.*?):非贪婪匹配,确保只匹配到下一个Book number:或文件末尾,避免过度匹配。
    • (?=Book number:|$):正向预查,作为匹配结束边界,不包含Book number:本身。
  3. 替换控制:Regex.Replace默认会替换所有匹配项,若需明确限制最多500次,可添加参数500。
  4. 输出处理:统一写入文件,避免循环内重复写入的问题。

批量处理多个文件

若需处理目录下多个文本文件,可添加遍历逻辑:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:45:30