如何在Inno Setup中拆分字符串

时间:2014-05-23 19:04:02

标签: inno-setup pascalscript

如何在Inno Setup中拆分字符串?
Inno Setup中是否有任何特殊功能来分割字符串?

我想从字符串'11.2.0.16'中获取以下内容:

tokens: array of string = ('11', '0', '2', '16');

提前致谢!

4 个答案:

答案 0 :(得分:8)

我今天一直在寻找同样的事情......

这个在Inno Setup Scripts上运行得很好。将此摘录粘贴到脚本中,然后在过程/函数之前将其称为“拆分”过程。

如果您愿意,也可以将其修改为一个功能......

procedure Explode(var Dest: TArrayOfString; Text: String; Separator: String);
var
  i, p: Integer;
begin
  i := 0;
  repeat
    SetArrayLength(Dest, i+1);
    p := Pos(Separator,Text);
    if p > 0 then begin
      Dest[i] := Copy(Text, 1, p-1);
      Text := Copy(Text, p + Length(Separator), Length(Text));
      i := i + 1;
    end else begin
      Dest[i] := Text;
      Text := '';
    end;
  until Length(Text)=0;
end;

procedure Whatever();
var 
  str: String;
  strArray: TArrayOfString;
  i: Integer;
begin
  Explode(strArray,str,'.');
  for i:=0 to GetArrayLength(strArray)-1 do begin
    //do something
  end;
end;

取自here

答案 1 :(得分:6)

对于任何喜欢功能格式的人,我已经从@ cezar-lamann修改了上述内容:

function StrSplit(Text: String; Separator: String): TArrayOfString;
var
  i, p: Integer;
  Dest: TArrayOfString; 
begin
  i := 0;
  repeat
    SetArrayLength(Dest, i+1);
    p := Pos(Separator,Text);
    if p > 0 then begin
      Dest[i] := Copy(Text, 1, p-1);
      Text := Copy(Text, p + Length(Separator), Length(Text));
      i := i + 1;
    end else begin
      Dest[i] := Text;
      Text := '';
    end;
  until Length(Text)=0;
  Result := Dest
end;

答案 2 :(得分:2)

这是我使用的:

Procedure SplitString(S, Delim: String; Var Dest: TArrayOfString);
  Var
    Temp: String;
    I, P: Integer;
  Begin
  Temp := S;
  I := StringChangeEx(Temp, Delim, '', True);
  SetArrayLength(Dest, I + 1);
  For I := 0 To GetArrayLength(Dest) - 1 Do
    Begin
    P := Pos(Delim, S);
    If P > 0 Then
      Begin
      Dest[I] := Copy(S, 1, P - 1);
      Delete(S, 1, P + Length(Delim) - 1);
      End
    Else
      Dest[I] := S;
    End;
  End;

此版本通过使用StringChangeEx计算分隔符并仅设置一次数组大小来避免重复调整数组大小。因为我们知道数组的大小,所以我们可以使用For循环。我还选择了Delete而不是Copy,它(IMO)使代码更易于阅读。 (此版本还修复了如果分隔符超过1个字符的情况,则无法正确进行拆分的错误。)

答案 3 :(得分:1)

如果定界符也可能恰好位于字符串的末尾,那么这就是我使用的(从@timyha的答案修改而来)

function StrSplit(Text: String; Separator: String): TArrayOfString;
var
  i, p: Integer;
  Dest: TArrayOfString; 
begin
  i := 0;
  repeat
    SetArrayLength(Dest, i+1);
    p := Pos(Separator,Text);

    if p > 0 then begin
      Dest[i] := Copy(Text, 1, p-1);
      Text := Copy(Text, p + Length(Separator), Length(Text));
      i := i + 1;
      
      //add an empty string if delim was at the end 
         
      if Text = '' then begin
        Dest[i]=''; 
        i := i + 1;
      end;

    end else begin
      Dest[i] := Text;
      Text := '';
    end;
  until Length(Text)=0;
  Result := Dest
end;