我需要比较一个部分字符串 "SKILL_______EU_______WAND_______CLERIC_______BASE_____01" 和 "SKILL",这是为了检查前四个字符是否为 "SKILL"。或者只检查第一个字符,这里需要优化!
我的问题:
我的问题:
- 我不知道如何进行优化的比较。
- 它必须重复 35,000 次,所以必须非常快速。
使用 StrUtils.AnsiStartsStr 进行区分大小写比较,使用 StrUtils.AnsiStartsText 进行不区分大小写的比较(将 StrUtils 添加到您的 uses 子句中)
如果你想要最佳速度,你需要自己编写一个小的StartsWith函数。
// untested, case-sensitive
Function StartsWith(const find, text : string) : Boolean;
var i, len : integer;
begin
result := true;
len := Min(Length(find), Length(text));
For i := 1 to len do
Begin
if (find[i] <> text[i])
then begin
result := False;
break;
end;
End;
end;
如今,35000次重复并不算太多,你做什么可能并不重要。
我认为Delphi程序非常优化和快速,所以只需使用它们。
var
position : Integer;
begin
// AnsiPos
// returns the position of a substring in a string
// or 0 if the substring isn't found
position := AnsiPos('SKILL', 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01');
end;
if 'S' = 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01'[1] then
begin
showmessage('SKILL');
end
function StartsWith( const AMatchStr, ATestStr : string ) : boolean;
begin
Result := SameText( AMatchStr, copy( ATestStr, 1, Length( AMatchStr ));
end;
这将不会处理 ATestStr 的起始文本之外的任何部分。Bri
StrLComp
而不是制作字符串的临时副本。 - Rob Kennedyi:= Length('SKILL');
LeftStr('SKILL_______EU_______WAND_______CLERIC_______BASE_____01',i) = 'SKILL'
if AnsiPos('SKILL', 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01') > 0 then
我认为这应该可以完成工作,但我不了解 AnsiPos 的速度,它是快还是慢或其他什么情况。每当我想要比较字符串的片段时,它对我很有效。AnsiPos() 返回一个整数值,表示您要查找的字符串的起始索引。
我对Delphi不是很了解,但我认为(在任何语言/框架/平台上)正则表达式是最快的字符串扫描方式...
您并没有明确指定您要搜索的所有条件...