高分寻求支持中文的快速字符串操作函数(加CSDN中的200分) (300分)

to beta:
aList.Names[0]:='a';
aList.Names[1]:='b';
aList.Names[2]:='c';
aList.Strings[0]:='x';
aList.Strings[1]:='y';
aList.Strings[2]:='z';
其中的Names是从字符串中取出的,而Strings是根据Names从数据库中相应的字段取出的
实际上我是要修改一个根据模板html文件生成相应的网页文件,现在的程序已经完成了
功能,但是效率不能今人满意,所以要修改提高效率,你说的一边查找一边替换应该可以,
因为原程序的思路是全部查找出来再替换,可能是效率低的关键了.明天改
 
呵呵,当我看出你的倒数第二个函数的意思的时候也就基本上猜到了你的程序意图了
其实这个东西我也曾经想过去做一个,方便对不支持ASP的网页动态更新,一直没有
动手,既然您做了,到时候记得给我一份:)

如果Names的可能性不是很多,可以考虑先把所有的Names-Values对应关系都读入内存
以提高查找运行效率。
还有,不要直接用 TStringList 的 Values 和 Names 属性,因为他们是在同一行上,
这样每次取 Names 和 Values 的时候都会对一些行进行解析从而降低效率,建议把你
的 Values 放在 TStringList 的 Objects 里面,可以加快检索 Names 的速度。

 
分析了半天,字符串操作不是瓶颈,失败!
 
saoren最后的GetBewteenString函数好像有点问题,不能达到目的。
我刚好也要用到,修改如下:
function GetBewteenString(const TextStr, FirstSubStr, LastSubStr: string

IgnoreCase: Boolean
List: TStrings): Integer;
var
Text: PByte;
TextLen: Integer;
FirstBuffer: array [0..MAX_CHAR - 1] of Integer;
LastBuffer: array [0..MAX_CHAR - 1] of Integer;

function FindMatchIndex(const Sub: PByte;
Buffer: array of Integer
SubLen, CurrPos: Integer): Integer;
var
I, J: Integer;
begin
Result := -1;
while CurrPos < TextLen do
begin
I := CurrPos;
J := SubLen - 1;
while (J >= 0) and
((PByteArr(Text)^ = PByteArr(Sub)^[J]) or
(IgnoreCase and (UpCase(PCharArr(Text)^) = PCharArr(Sub)^[J]))) do
begin
Dec(J);
Dec(I);
end;
if -1 = J then
begin
Result := CurrPos - SubLen + 2;
break;
end else
begin
if IgnoreCase then
Inc(CurrPos, Buffer[Byte(UpCase(PCharArr(Text)^[CurrPos]))])
else
Inc(CurrPos, Buffer[PByteArr(Text)^[CurrPos]]);
end;
end;
end;

var
FirstSub, LastSub: PByte;
I, CurrPos, LastPos, FirstPos, FirstLen, LastLen: Integer;
begin
Result := 0;
List.Clear

FirstLen := Length(FirstSubStr);
LastLen := Length(LastSubStr);
if (FirstLen = 0) or (LastLen = 0) then Exit;
TextLen := Length(TextStr);

FirstSub := @FirstSubStr[1];
LastSub := @LastSubStr[1];
Text := @TextStr[1];

if IgnoreCase then
begin
GetMem(FirstSub, FirstLen);
Move(FirstSubStr[1], FirstSub^, FirstLen);
FirstSub := PByte(StrUpper(PChar(FirstSub)));

GetMem(LastSub, LastLen);
Move(LastSubStr[1], LastSub^, LastLen);
LastSub := PByte(StrUpper(PChar(LastSub)));
end;

for I := 0 to MAX_CHAR - 1 do
begin
FirstBuffer := FirstLen;
LastBuffer := LastLen;
end;

for I := 0 to FirstLen - 2 do
FirstBuffer[PByteArr(FirstSub)^] := FirstLen - I - 1;
for I := 0 to LastLen - 2 do
LastBuffer[PByteArr(LastSub)^] := LastLen - I - 1;

List.BeginUpdate;
CurrPos := FirstLen;

try
while CurrPos < TextLen do
begin
FirstPos := FindMatchIndex(FirstSub, FirstBuffer, FirstLen, CurrPos-1);
if FirstPos <> -1 then
begin
LastPos := FindMatchIndex(LastSub, LastBuffer, LastLen, FirstPos + FirstLen);
if LastPos <> -1 then
begin
Inc(Result);
List.Add(Copy(TextStr, FirstPos + FirstLen, LastPos - FirstPos - FirstLen));
CurrPos := LastPos + LastLen;
end else
begin
if IgnoreCase then
Inc(CurrPos, FirstBuffer[Byte(UpCase(PCharArr(Text)^[CurrPos]))])
else
Inc(CurrPos, FirstBuffer[PByteArr(Text)^[CurrPos]]);
end;
end else
break
//如果没有找到FirstSub,那退出.
end;
finally
List.EndUpdate;
if IgnoreCase then
begin
FreeMem(FirstSub);
FreeMem(LastSub);
end;
end;
end


**************
以下部分变动了:
CurrPos := FirstLen;

try
while CurrPos < TextLen do
begin
FirstPos := FindMatchIndex(FirstSub, FirstBuffer, FirstLen, CurrPos-1);
if FirstPos <> -1 then
begin
LastPos := FindMatchIndex(LastSub, LastBuffer, LastLen, FirstPos + FirstLen);
 

Similar threads

S
回复
0
查看
950
SUNSTONE的Delphi笔记
S
S
回复
0
查看
774
SUNSTONE的Delphi笔记
S
顶部