Delphi开发小说阅读器的正则表达式示例代码

使用 GPT-4o Mini 回答,作者 GPT4oMini.app

问题:

我需要使用delphi开发小说阅读器,需要使用正则表达式将txt的小说文档进行分割,提取标题和小说章节文本,我的小说章节标题的正则表达式为:^[  \t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第\s{0,4}[\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$,delphi xe 10 中 perlregex在System.RegularExpressionsCore中,使用opendialog打开txt文件,将标题输出到一个listbox组件中,请输出详细代码

procedure TForm4.btn2Click(Sender: TObject); begin if dlgOpen1.Execute then begin ParseNovel(dlgOpen1.FileName, lst1); end; end;

procedure ParseNovel(txtFilePath: string; ListBox: TListBox);

答案:

下面是一个使用 Delphi XE 10 中的 System.RegularExpressions 单元来解析小说文本文件的示例代码。该代码会打开一个文本文件,使用正则表达式提取章节标题,并将其添加到 TListBox 组件中。

首先,请确保在你的 Delphi 项目中添加了 System.RegularExpressions 单元。

以下是完整的代码示例:

uses
  System.SysUtils, System.Classes, System.RegularExpressions, Vcl.Dialogs, Vcl.StdCtrls;

procedure TForm4.btn2Click(Sender: TObject);
begin
  if dlgOpen1.Execute then
  begin
    ParseNovel(dlgOpen1.FileName, lst1);
  end;
end;

procedure ParseNovel(txtFilePath: string; ListBox: TListBox);
var
  FileStream: TFileStream;
  StreamReader: TStreamReader;
  Line: string;
  Regex: TRegEx;
  Match: TMatch;
begin
  // 清空 ListBox
  ListBox.Clear;

  // 正则表达式
  Regex := TRegEx.Create('^[  \t]{0,4}(?:序章|楔子|正文(?!完|结)|终章|后记|尾声|番外|第\s{0,4}[\d〇零一二两三四五六七八九十百千万壹贰叁肆伍陆柒捌玖拾佰仟]+?\s{0,4}(?:章|节(?!课)|卷|集(?![合和])|部(?![分赛游])|篇(?!张))).{0,30}$');

  // 打开文件
  FileStream := TFileStream.Create(txtFilePath, fmOpenRead or fmShareDenyWrite);
  try
    StreamReader := TStreamReader.Create(FileStream, TEncoding.UTF8);
    try
      // 逐行读取文件
      while not StreamReader.EndOfStream do
      begin
        Line := StreamReader.ReadLine;

        // 匹配正则表达式
        Match := Regex.Match(Line);
        if Match.Success then
        begin
          // 将匹配的标题添加到 ListBox
          ListBox.Items.Add(Line);
        end;
      end;
    finally
      StreamReader.Free;
    end;
  finally
    FileStream.Free;
  end;
end;

代码说明:

  1. btn2Click:当用户点击按钮时,打开文件对话框,选择一个文本文件,并调用 ParseNovel 函数进行解析。

  2. ParseNovel

    • 清空 ListBox 中的内容。
    • 创建一个正则表达式对象 Regex,用于匹配章节标题。
    • 使用 TFileStream 打开指定的文本文件,并使用 TStreamReader 逐行读取文件内容。
    • 对每一行使用正则表达式进行匹配,如果匹配成功,则将该行(章节标题)添加到 ListBox 中。

注意事项:

  • 确保你的文本文件编码为 UTF-8,以便正确读取中文字符。
  • 根据需要调整正则表达式,以确保它能够匹配你的小说章节标题格式。
  • 你可能需要在 Delphi IDE 中添加 Vcl.DialogsVcl.StdCtrls 单元,以便使用对话框和列表框组件。