如何在Inno Setup中拆分字符串?
Inno Setup中是否有任何特殊功能来分割字符串?
我想从字符串'11.2.0.16'
中获取以下内容:
tokens: array of string = ('11', '0', '2', '16');
提前致谢!
答案 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;