PDA

Просмотр полной версии : Вопрос про текст


supernewbie
22.05.2010, 18:05
Можно ли прочесть скриптом из текста в юникоде, отдельное слово?
что-то вроде пишут "Продам хай 76", а скрипт реагировал только на слово "хай" или "76"?

Пытался написать что-то в этом роде... не работает, вот решил у вас спросить)

begin
if fromserver and (connectname=Name) and (pck[1]=#$4A) and (ReadS(10)=Name) then
begin
j:=26;
for i:=1 to listcount do begin
text:=ReadS(j);
if (text='стоп') then
begin
Say(text);
end;
end;
j:=(j+2);
end;
end;

J-Fobos
22.05.2010, 19:04
С помощью ReadS(); загоняете строку в переменную типа string , а потом обычным алгоритмом поиска текста в строке обрабатываете эту строку.

supernewbie
23.05.2010, 22:36
что за алгоритм?

J-Fobos
23.05.2010, 23:35
что за алгоритм?
Да таких алгоритмов куча :) Для больших строк, для маленьких, при разных условиях и в разных средах применения ...
тык сюда (http://www.lmgtfy.com/?q=Pascal+%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1% 82%D0%BC%D1%8B+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B 0+%20%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0 %BA%D0%B8+%D0%B2+%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0 %B5)

Xen
23.05.2010, 23:37
// стандартная дельфи функция, возвращает позицию i слова 'строка' в строке s
s:='Это тестовая строка для поиска слова';
i:= pos('строка',s); // pos - регистрозависимая фун-я!

//---------------------------------------------
// тоже самое что и Pos, но поиск идет с конца строки
function LastPos(SearchStr, Str: string): Integer;
var
i: Integer;
TempStr: string;
begin
Result := Pos(SearchStr, Str);
if Result = 0 then Exit;
if (Length(Str) > 0) and (Length(SearchStr) > 0) then
begin
for i := Length(Str) + Length(SearchStr) - 1 downto Result do
begin
TempStr := Copy(Str, i, Length(Str));
if Pos(SearchStr, TempStr) > 0 then
begin
Result := i;
break;
end;
end;
end;
end;

//---------------------------------------------
// Ищет следующее вхождение строки с определенной позиции
function NextPos(SearchStr, Str: string; Position: Integer): Integer;
begin
Delete(Str, 1, Position - 1);
Result := Pos(SearchStr, upperCase(Str));
if Result = 0 then Exit;
if (Length(Str) > 0) and (Length(SearchStr) > 0) then
Result := Result + Position + 1;
end;

//---------------------------------------------

function NextPosRel(SearchStr, Str: string; Position: Integer): Integer;
begin
Delete(Str, 1, Position - 1);
Result := Pos(SearchStr, UpperCase(Str)) - 1;
end;

//---------------------------------------------

function ReplaceStr(Str, SearchStr, ReplaceStr: string): string;
begin
while Pos(SearchStr, Str) <> 0 do
begin
Insert(ReplaceStr, Str, Pos(SearchStr, Str));
Delete(Str, Pos(SearchStr, Str), Length(SearchStr));
end;
Result := Str;
end;


А еще"встроенные" AnsiStrRScan, AnsiPos т.д.

А вот то, что тебе так нужно:

{ алгоритм Бойера-Мура
>> алгоритм поиска подстроки в строке

Зависимости: SysUtils
Автор: ALex2)
Copyright: 2)
Дата: 1 февраля 2003 г.
************************************************** *** }

function BMSearch(StartPos: Integer; const S, P: string): Integer;
type
TBMTable = array[0..255] of Integer;
var
Pos, lp, i: Integer;
BMT: TBMTable;
begin

for i := 0 to 255 do
BMT[i] := Length(P);
for i := Length(P) downto 1 do
if BMT[Byte(P[i])] = Length(P) then
BMT[Byte(P[i])] := Length(P) - i;

lp := Length(P);
Pos := StartPos + lp - 1;
while Pos <= Length(S) do
if P[lp] <> S[Pos] then
Pos := Pos + BMT[Byte(S[Pos])]
else if lp = 1 then
begin
Result := Pos;
Exit;
end
else
for i := lp - 1 downto 1 do
if P[i] <> S[Pos - lp + i] then
begin
Inc(Pos);
Break;
end
else if i = 1 then
begin
Result := Pos - lp + 1;
Exit;
end;
Result := 0;

end;

{
ф-ия возвращает первое вхождение подстроки в строку
работает быстро
}
Пример использования:

BMSearch(1, 'dsade', 'de')
// в данном примере ф-ия возвратит число 4
// 1 - это позиция с которой ищем подстроку в строке

J-Fobos
23.05.2010, 23:43
s:='Это тестовая строка для поиска слова';
i:= pos('строка',s);

AnsiStrRScan, AnsiPos т.д.
А они есть в скриптовом движке пакетхака? А то я не смотрел...

supernewbie
24.05.2010, 11:09
s:='Это тестовая строка для поиска слова';
i:= pos('строка',s); // pos - регистрозависимая фун-я!

//---------------------------------------------

function LastPos(SearchStr, Str: string): Integer;
var
i: Integer;
TempStr: string;
begin
Result := Pos(SearchStr, Str);
if Result = 0 then Exit;
if (Length(Str) > 0) and (Length(SearchStr) > 0) then
begin
for i := Length(Str) + Length(SearchStr) - 1 downto Result do
begin
TempStr := Copy(Str, i, Length(Str));
if Pos(SearchStr, TempStr) > 0 then
begin
Result := i;
break;
end;
end;
end;
end;

//---------------------------------------------

function NextPos(SearchStr, Str: string; Position: Integer): Integer;
begin
Delete(Str, 1, Position - 1);
Result := Pos(SearchStr, upperCase(Str));
if Result = 0 then Exit;
if (Length(Str) > 0) and (Length(SearchStr) > 0) then
Result := Result + Position + 1;
end;

//---------------------------------------------

function NextPosRel(SearchStr, Str: string; Position: Integer): Integer;
begin
Delete(Str, 1, Position - 1);
Result := Pos(SearchStr, UpperCase(Str)) - 1;
end;

//---------------------------------------------

function ReplaceStr(Str, SearchStr, ReplaceStr: string): string;
begin
while Pos(SearchStr, Str) <> 0 do
begin
Insert(ReplaceStr, Str, Pos(SearchStr, Str));
Delete(Str, Pos(SearchStr, Str), Length(SearchStr));
end;
Result := Str;
end;


А еще"встроенные" AnsiStrRScan, AnsiPos т.д.

госпади, а можно хотя бы с пояснениями)