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

Delphi中如何从字符串中批量删除多个子串?

删除Delphi字符串中多个子串的几种方法

嘿,这个需求在Delphi里其实有好几种靠谱的实现方式,我给你拆解一下,针对你要把'12345678'处理成'1478'的场景,每种方法都有适用的情况:

方法1:从后往前调用Delete函数(最直接,适合已知删除位置的场景)

Delphi的Delete函数是按起始位置和长度删除子串,但要注意如果从前往后删,前面的删除会改变后续字符的位置,导致你原本记的位置失效。所以最稳妥的方式是从后往前删:

var
  S: string;
begin
  S := '12345678';
  // 先删除靠后的子串:原位置5开始的2个字符(对应'5'和'6')
  Delete(S, 5, 2);
  // 再删除靠前的子串:原位置2开始的2个字符(对应'2'和'3')
  Delete(S, 2, 2);
  ShowMessage(S); // 输出结果:'1478'
end;

为什么要从后往前?因为先删后面的部分,不会影响前面要删除的子串的位置,避免计算偏移量的麻烦。

方法2:构建新字符串(适合按字符筛选或复杂位置规则的场景)

如果你的需求是保留特定位置的字符,或者筛选出不需要删除的字符,可以直接遍历原字符串,把需要的字符拼接成新字符串:

按位置保留

var
  S, ResultStr: string;
  I: Integer;
  KeepPositions: array of Integer;
begin
  S := '12345678';
  // 定义要保留的字符位置(Delphi字符串是1-based索引)
  SetLength(KeepPositions, 4);
  KeepPositions[0] := 1; // '1'
  KeepPositions[1] := 4; // '4'
  KeepPositions[2] := 7; // '7'
  KeepPositions[3] := 8; // '8'

  ResultStr := '';
  for I := 0 to High(KeepPositions) do
  begin
    // 确保位置在字符串有效范围内
    if (KeepPositions[I] >= 1) and (KeepPositions[I] <= Length(S)) then
      ResultStr := ResultStr + S[KeepPositions[I]];
  end;
  ShowMessage(ResultStr); // 输出:'1478'
end;

按字符内容筛选

如果你的需求是删除特定字符(比如删'2'、'3'、'5'、'6'),这种方式更灵活:

var
  S, ResultStr: string;
  I: Integer;
begin
  S := '12345678';
  ResultStr := '';
  for I := 1 to Length(S) do
  begin
    // 只保留不在删除列表里的字符
    if not (S[I] in ['2','3','5','6']) then
      ResultStr := ResultStr + S[I];
  end;
  ShowMessage(ResultStr); // 输出:'1478'
end;

方法3:正则表达式替换(适合按模式匹配删除的场景)

如果你的Delphi版本是XE及以上(自带System.RegularExpressions单元),可以用正则表达式一次性替换掉所有要删除的子串:

uses
  System.RegularExpressions;

var
  S: string;
begin
  S := '12345678';
  // 用|分隔多个要匹配的子串,替换为空字符串
  S := TRegEx.Replace(S, '23|56', '');
  ShowMessage(S); // 输出:'1478'
end;

这种方式适合需要删除多个固定模式子串的场景,代码更简洁。


内容的提问来源于stack exchange,提问作者Serge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:22:50