delphi 从文本文件中删除子字符串

yqkkidmi  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(118)

我需要 Delphi 代码从文本文件中删除一个子字符串。问题是,子字符串不是特定的。我们只知道第一个和最后一个字符。
例如,我们删除'['和']'之间的任何字符:
使用前:
[P][strong]Stack Overflow[/strong]是一个非常有用的论坛,可以获得知识。
之后:
Stack Overflow是一个非常有用的论坛,可以获得知识。
我已经读过Find and Replace Text in a Large TextFile (Delphi XE5)了,它很有帮助,但是它使用了一个固定的子字符串,我仍然困惑如何像我想要的那样修改它。

eeq64g8w

eeq64g8w1#

对文件进行文本替换的唯一方法是读取文件,进行替换并再次将其写入。没有内置的方法可以简单地调用
ReplaceInFile(,,)
或其任何衍生物。
因此,一个粗略的方法(假设是现代的 Delphi 版本)是:

TYPE
  TLineEvent = REFERENCE TO FUNCTION(CONST STR : STRING) : STRING;

PROCEDURE ProcessTextFile(CONST FileName : STRING ; Event : TLineEvent ; E : TEncoding = NIL);
  VAR
    SL : TStrings;
    I  : Integer;

  BEGIN
    SL:=TStringList.Create;
    TRY
      IF NOT Assigned(E) THEN E:=TEncoding.ANSI;
      SL.LoadFromFile(FileName,E);
      FOR I:=0 TO SL.Count-1 DO SL[I]:=Event(SL[I]);
      SL.SaveToFile(FileName,E)
    FINALLY
      SL.Free
    END
  END;

然后你这样调用它:

ProcessTextFile(FileName,FUNCTION(CONST STR : STRING) : STRING
                           BEGIN
                             <Put your code here>
                           END);

其中<Put your code here>是删除[]区域的代码。
当然,这可以通过各种方式进行优化,但我希望您能够了解它的要点。

scyqe7ek

scyqe7ek2#

作为一个正则表达式的忠实粉丝,我建议你试试下面的代码:

uses
    RegularExpressionsCore;

procedure TForm1.Button3Click(Sender: TObject);
var
    Regex: TPerlRegEx;
    sapp: string;
begin
    sapp := '[P][strong]Stack Overflow[/strong] is a very helpful website for knowledge.[/p]';
    Regex := TPerlRegEX.Create;

    try
        Regex.RegEx := '\[.*?\]';
        Regex.State := [preNotEmpty];
        Regex.Options := [preNoAutoCapture];
        Regex.Subject := sapp;

        if Regex.Match then
        repeat
            Regex.Replacement := '';
            Regex.Replace;
        until not Regex.MatchAgain;

        sapp := Regex.Subject;
    finally
        Regex.Free;
    end;

    ShowMessage(sapp);
end;

这个技巧基本上都是由这个正则表达式完成的:

Regex.RegEx := '\[.*?\]';

它基本上找到你需要的第一个字符(在本例中为[),在右括号的第一个示例处停止(在本例中为]),并获取这2个字符加上中间的所有字符(通过.*)。不要忘记放?,否则右括号将是你需要的字符串的最后一个示例!
用 Delphi 制作11.你可以在你拥有的或者喜欢的每个库中使用正则表达式!

相关问题