не понял. Вы работали с большим объёмом данных. попытались оптимизировать. И разница не большая? Может что то не так делали?50000000 и символов больше. Заморочился с оптимизациями этими, в итоге разница была смехотворная.
Модератор: Модераторы
не понял. Вы работали с большим объёмом данных. попытались оптимизировать. И разница не большая? Может что то не так делали?50000000 и символов больше. Заморочился с оптимизациями этими, в итоге разница была смехотворная.
Лекс Айрин писал(а):я просто не догоняю как кармически правильно реализовать указатель на текущий символ
resident писал(а):Это провокация
resident писал(а):Это ж элемент массива [i] - номер байта. Ваши скобки "<>" из исконной ASCII, т.е. кодируются одним байтом всегда
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
{ you can add units after this }
SysUtils;
Type
OnOff=boolean;
TTag=record
Str:String;
// verify:OnOff;
tags:boolean;
end;
function FirstTag (var Str:String):TTag;
Var
Start, Finish:boolean;
StrTag:String;
Begin
If Str='' then
begin
Result.Str:='';//отсев ошибочного использования
end else
begin
Start:=False; // инициализация переменных.
Finish:=False;
Result.Str:='';
Result.tags:=true;
StrTag:='';
while Finish=false do //
begin
if Str='' then
Begin
Finish:=True;//выход из цикла по исчерпанию строки. условия выхода могут быть любые
Result.tags:=false;
End else
Begin
StrTag:=Copy(Str,1,1);
case StrTag of
'<':
Begin
if Start=true then
Begin //это второй символ '<'
Finish:=True; // штатный выход если это все же не тег.
Result.tags:=false;
end else //это первый символ '<'.
begin // начинаем копировать предположительно тег в строку
if Result.Str='' then
begin
Start:=True;
Result.Str:=Result.Str+StrTag;
Delete(Str, 1, 1);
end else
begin // результат -- все, что до символа '<' НЕ тег
Finish:=True;
result.tags:=false;
end;
end
end;
'>':
Begin
Result.Str:=Result.Str+StrTag;
Delete(Str, 1, 1);
if Start=true then
begin
Finish:=True;// штатный выход если тег
result.tags:=true;
end else
begin
Finish:=True;// штатный выход если НЕ тег
result.tags:=false;
end;
end;
else Begin
Result.Str:=Result.Str+StrTag; // обычный символ
Delete (Str, 1, 1);
End;
end;
end;
end;
end;
end;
function FirstTag2 (const Str:String):TTag;
var
i, k, L: integer;
begin
i := 0;
L := Length(Str);
repeat
Inc(i);
if Str[i] = '<' then
begin
k := i;
repeat
Inc(k);
if Str[k] = '>' then
begin
Result.Str := Copy(Str, Succ(i), Pred(k - i));
Result.tags := Length(Result.Str) > 0;
exit;
end;
until k = L;
end;
until i = L;
Result.Str := '';
Result.tags := false;
end;
function FirstTag3 (const Str:String):TTag;
var
i, k: integer;
S: string;
begin
Result.Str := '';
i := Pos('<', Str);
if i > 0 then
begin
S := pChar(@Str[i]);
k := Pos('>', S);
if k > 0 then Result.Str := Copy(S, Succ(1), Pred(Pred(k)));
end;
Result.tags := Length(Result.Str) > 0;
end;
{function TestTag (Str:TTag):Boolean;
Var
TempStr:string;
Begin
TempStr:=Copy(Str.Str,0,4);//больше 4 вряд ли потребуется
{
теги после которых строка переводится:
<bp> </h1 <h2 <h3 </p> </di </ta </tr </th </tb </li
во всех остальных случаях нет!}
//showMessage ('function TestTag -- TempStr='+TempStr);
case TempStr of
'<bp>', '</h1', '<h2', '<h3', '</p>', '</di', '</ta', '</tr', '</th', '</tb', '</li'
:begin
result:=true;
end;}
function BoolToStr(B: boolean): string;
begin
if B then
Result := 'true' else
Result := 'false';
end;
Var
TempStr:string;
begin
writeln('*****************************************' + sLineBreak + 'TempStr');
TempStr := '_12<first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag(TempStr).tags) + ': ' + FirstTag2(TempStr).Str);
writeln('*****************************************' + sLineBreak + sLineBreak + sLineBreak + 'TempStr2');
TempStr := '_12<first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag2(TempStr).tags) + ': ' + FirstTag2(TempStr).Str);
TempStr := '_12<first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag2(TempStr).tags) + ': ' + FirstTag2(TempStr).Str);
TempStr := 'first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag2(TempStr).tags) + ': ' + FirstTag2(TempStr).Str);
TempStr := '_12<firstasdasd<dasdas<qweqweasdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag2(TempStr).tags) + ': ' + FirstTag2(TempStr).Str);
TempStr := '_12first>asdasddasdas>qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag2(TempStr).tags) + ': ' + FirstTag2(TempStr).Str);
writeln('*****************************************' + sLineBreak + sLineBreak + sLineBreak + 'TempStr3');
TempStr := 'firstasdasddasdasqweqweasdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := '<first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := '<>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := '_12<>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := '_12<first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := 'first>asdasd<dasdas><qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := '_12<firstasdasd<dasdas<qweqweasdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
TempStr := '_12first>asdasddasdas>qweqwe>asdasd';
writeln(sLineBreak + TempStr);
writeln(BoolToStr(FirstTag3(TempStr).tags) + ': ' + FirstTag3(TempStr).Str);
readln;
end.
_12<fi<rst>asdasd<dasdas><qweqwe>asdasd
true: fi<rst
Лекс Айрин писал(а):например, вот это ошибка алгоритма -- не учитывается, что угловая скобка может быть частью строки, но не может быть составной частью тега.
function FirstTag2 (const Str:String):TTag;
var
i, k, m, L: integer;
S: string;
begin
Result.Str := '';
Result.tags := false;
L := Length(Str);
i := Pos('<', Str);
if i > 0 then
begin
k := i;
repeat
Inc(k);
if Str[k] = '<' then i := k; // Сначала строки - мусор, среди которого были и открывающиеся скобки. Принимаю новую позицию открывающейся скобки
if Str[k] = '>' then // Целый тег найден
begin
if i = 1 then
// Строка начинается с тега - копирую содержимое элемента между тегами
begin
S := pChar(@Str[Succ(i)]);
i := Pos('>', S);
k := Pos('<', S);
Result.Str := Copy(S, Succ(i), Pred(k - i));
Result.tags := Length(Result.Str) > 0;
end else
// Строка начинается с мусора - копирую имя тега
begin
Result.Str := Copy(Str, Succ(i), Pred(k - i));
end;
exit;
end;
until k = L;
end;
end;
resident писал(а):Ваша вроде тоже не безупречна.
- хтмл... там же много мусора. Или вам и мусор необходим?импорт текста из html/xml формата
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 251