- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 StrUtils
将字符串拆分为 TStringDynArray
,但输出不符合预期。我将尝试解释这个问题:
我有一个字符串str
:'a'; 'b'; 'c'
现在我调用 StrUtils.SplitString(str, '; ');
来拆分字符串,我期望一个包含三个元素的数组:'a'
、'b '
, 'c'
但是我得到的是一个包含五个元素的数组:'a'
、''
、'b'
、' '
,'c'
。
当我只用 ';'
而不是 '; 进行拆分时'
我得到三个带有前导空白的元素。
那么为什么我的第一个解决方案中会得到空字符串?
最佳答案
此函数旨在不合并连续的分隔符。例如,考虑用逗号分割以下字符串:
foo,,bar
您希望 SplitString('foo,,bar', ',')
返回什么?您要寻找 ('foo', 'bar')
还是答案应该是 ('foo', '', 'bar')
?目前尚不清楚哪个先验是正确的,并且不同的用例可能需要不同的输出。
如果您的情况,您指定了两个分隔符:';'
和' '
。这意味着
'a'; 'b'
在 ';'
处拆分,然后在 ' '
处再次拆分。这两个分隔符之间没有任何内容,因此在 'a'
和 'b'
之间返回一个空字符串。
Split
方法来自 string helper XE3中引入了一个TStringSplitOptions
范围。如果您为该参数传递 ExcludeEmpty
,则连续分隔符将被视为单个分隔符。该程序:
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
S: string;
begin
for S in '''a''; ''b''; ''c'''.Split([';', ' '], ExcludeEmpty) do begin
Writeln(S);
end;
end.
输出:
'a''b''c'
But you do not have this available to you in XE2 so I think you are going to have to roll your own split function. Which might look like this:
function IsSeparator(const C: Char; const Separators: string): Boolean;
var
sep: Char;
begin
for sep in Separators do begin
if sep=C then begin
Result := True;
exit;
end;
end;
Result := False;
end;
function Split(const Str, Separators: string): TArray<string>;
var
CharIndex, ItemIndex: Integer;
len: Integer;
SeparatorCount: Integer;
Start: Integer;
begin
len := Length(Str);
if len=0 then begin
Result := nil;
exit;
end;
SeparatorCount := 0;
for CharIndex := 1 to len do begin
if IsSeparator(Str[CharIndex], Separators) then begin
inc(SeparatorCount);
end;
end;
SetLength(Result, SeparatorCount+1); // potentially an over-allocation
ItemIndex := 0;
Start := 1;
CharIndex := 1;
for CharIndex := 1 to len do begin
if IsSeparator(Str[CharIndex], Separators) then begin
if CharIndex>Start then begin
Result[ItemIndex] := Copy(Str, Start, CharIndex-Start);
inc(ItemIndex);
end;
Start := CharIndex+1;
end;
end;
if len>Start then begin
Result[ItemIndex] := Copy(Str, Start, len-Start+1);
inc(ItemIndex);
end;
SetLength(Result, ItemIndex);
end;
当然,所有这些都假设您想要一个空格作为分隔符。您已在代码中要求这样做,但也许您实际上只想 ;
充当分隔符。在这种情况下,您可能希望传递 ';'
作为分隔符,并修剪返回的字符串。
关于delphi - StrUtils.SplitString 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35840707/
我使用 StrUtils 将字符串拆分为 TStringDynArray,但输出不符合预期。我将尝试解释这个问题: 我有一个字符串str:'a'; 'b'; 'c' 现在我调用 StrUtils.Sp
我正在整理以前使用 FastStrings 的旧代码,并且我已经实现了我的旧例程“PosAnyCase”,它应该像“Pos”一样运行。 (我希望 SearchBuf 比在两个字符串上调用 UpperC
我使用的是 Delphi 5.0,在编译我的项目时收到错误“StrUtils.dcu not found”。这个错误和delphi版本有关吗?我不确定在哪个版本的 Delphi StrUtils.pa
Delphi 具有System.copy 和StrUtils.MidStr 函数,它们都从字符串 中返回子字符串。这两个函数有区别吗? 如果是这样,有什么区别?我什么时候应该使用每一个? 最佳答案 确
我是一名优秀的程序员,十分优秀!