字符串分割类

  TSPString = Class
  private
    FsSRC:string;
    sList:TStrings;
    FcMask: String;
    procedure SetMask(const Value: String);
    procedure SplitSToListEx(S: String; Seperator: String; List: TStrings;CaseSens : Boolean = True );
  public
    constructor create(const SRC:string;const sMask:string='|');
    destructor Destroy; override;
    procedure ReSetSRC(const SRC:string ;const sMask:string='|');
    property cMask:String read FcMask write SetMask;
    function colCount(cMask:string='|'):Integer;
    function getCol(const index:Integer;const cMask:string='|'):string;
  end;

{ TSPString }

function TSPString.colCount(cMask: string): Integer;
begin
  if cMask <> FcMask then begin
    FcMask := cMask;
    SplitSToListEx(FsSRC,FcMask,sList);
  end else begin
    if sList.Count <=0 then
      SplitSToListEx(FsSRC,FcMask,sList);
  end;
  Result := sList.Count;
end;

constructor TSPString.create(const SRC:string;const sMask:string);
begin
  FsSRC := SRC;
  sList := TStringList.Create;
  SetMask(sMask);
end;

destructor TSPString.Destroy;
begin
  FreeAndNil(sList);
  inherited;
end;

function TSPString.getCol(const index: Integer;const cMask: string): string;
begin
  if cMask <> FcMask then begin
    FcMask := cMask;
    SplitSToListEx(FsSRC,FcMask,sList);
  end else begin
    if sList.Count <=0 then
      SplitSToListEx(FsSRC,FcMask,sList);
  end;
  if sList.Count > 0 then begin
    if index >= sList.Count then
      Result := sList.Strings[sList.Count - 1]
    else if index < 0 then
      Result := sList.Strings[0]
    else
      Result := sList.Strings[index];
  end else begin
    Result :=  FsSRC;
  end;
end;

procedure TSPString.ReSetSRC(const SRC:string ;const sMask:string);
begin
  if (FsSRC <> SRC) or (FcMask <> sMask)then begin
    FsSRC := SRC;
    FcMask := '';
    SetMask(sMask);
  end;
end;

procedure TSPString.SetMask(const Value: String);
begin
  if FcMask <> Value then begin
    FcMask := Value;
    sList.Clear;
  end;
end;

procedure TSPString.SplitSToListEx(S, Seperator: String; List: TStrings;
  CaseSens: Boolean);
var
  tmps : String;
  i,iBeg,iSepLen : Integer;
  bMatch ,  bHaveItem : Boolean;
begin
  List.Clear;
  iBeg := 1;
  iSepLen := Length(Seperator);
  bHaveItem :=  False;

  for i := 1 to Length(S) do begin
    tmps := Copy(S,i,iSepLen);
    if CaseSens then
      bMatch := tmps  = Seperator
    else
      bMatch := CompareText(tmps,Seperator) = 0;

    if bMatch then begin
      List.Add(Copy(S,iBeg,i-iBeg));
      iBeg := i + iSepLen ;
      bHaveItem :=  True;
    end;
  end;
  if (iBeg <= Length(S)+1) and ( bHaveItem or (Length(S) > 0)) then
    List.Add(Copy(S,iBeg,Length(S)-iBeg+1));
end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值