Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Найти слово в строке


Автор: GELEAF 12.1.2007, 20:30
Я попытался сделать свой алгоритм поиска текста он у меня неполучилось,вернее получилось но неправильно.Короче он находит но буквы.Короче вот смотрите:
Код

function TForm1.findText(oldtext, findtext: string): boolean;
Var slovo:string;
i,ii:integer;
begin
for ii:=1 to length(findtext) do
for i:=ii to length(oldtext) do begin
if oldtext[i]=findtext[ii] then
begin
slovo:=slovo+oldtext[i];
Break;
end
end;
if findtext=slovo then Result:=True else result:=false;
end;


Подскажите ошибку,или посоветуйте другой алгоритм

Автор: Snowy 12.1.2007, 20:40
А не проще использовать стандартный Pos?

Автор: aktuba 12.1.2007, 20:49
GELEAF, что-то я не пойму, что ты делаешь...
Чем не устраивет Pos(oldtext, findtext)? А если хочешь заменять (мне так кажется) - используй StringReplace.

Ну, а если все-же хочется свое:

Код

function TForm1.findText(oldtext, findtext: string): boolean;
var
  Idx, len: Integer;
begin
  Result := False;
  Idx := 1;
  len := Length(findtext);
  while Idx <= Length(oldtext) do
    if Copy(oldtext, Idx, len) = findtext then
      begin
        Result := True;
        Break
      end;
end;


P.S.: пока писал - уже ответили  smile 

Автор: Beltar 12.1.2007, 21:49
Ну я как-то извращался. Фрагмент юнита.

Код

unit Common;

interface

uses Windows, SysUtils, DateUtils, IniFiles, Controls, Forms,
  Dialogs, Registry, StdCtrls, Grids, ShellAPI, SHFolder, ComCtrls;


type

TChars=set of Char;

var

  Letters:TChars=['A'..'Z','a'..'z'];
  Digits:TChars=['0'..'9'];

function SimpleTextSearch(P,Text:String;MatchCase,FullWord,Fwd:Boolean;
  Start:Integer):Integer;
{-1 ничего не найдено, иначе номер начала вхождения}
function IsLetterOrDigit(C:Char):Boolean;
function IsDividor(C:Char):Boolean;
function SearchNode(Items:TTreeNodes;P:String;MatchCase,FullWord,Fwd:Boolean;
  Start:Integer):Integer;

implementation




function IsLetterOrDigit(C:Char):Boolean;
begin
case byte(C) of
  48..57:Result:=true;
  65..90:Result:=true;
  97..122:Result:=true;
  184:Result:=true;
  192..255:Result:=true
  else Result:=false;
end
end;

function IsDividor(C:Char):Boolean;
begin
case Byte(C) of
  0..32:Result:=true;
  42..47:Result:=true;
  58..63:Result:=true;
  182:Result:=true
  else Result:=false;
end
end;

function SimpleTextSearch(P,Text:String;MatchCase,FullWord,Fwd:Boolean;
  Start:Integer):Integer;
var pos,i,l,Last:Integer;

function CheckFullWord:Boolean;
begin
Result:=false;
if Pos-1<>0 then
  if not IsDividor(Text[Pos-1]) then exit;
if Pos+l<=Length(Text) then
  if not isDividor(Text[Pos+l]) then exit;
Result:=true;
end;

function CheckCase:Boolean;
var s:String;
begin
s:=copy(Text,Pos,l);
if s<>P then Result:=false
        else Result:=true;
end;

begin

l:=Length(P);
if ((length(Text)=0) or (l=0)) then
  begin
  Result:=-1;
  exit;
  end;
if Fwd then
  begin
  Last:=Length(Text)-l+1;
  for Pos:=Start to Last do
    begin
    i:=0;
    while ANSICompareText(P[i+1],Text[Pos+i])=0 do
      begin
      inc(i);
      if i=l then
        begin
        //Проверка на слово целиком
        if FullWord then
          if not CheckFullWord then break;
        //Проверка на соответствие регистру
        if MatchCase then
          if not CheckCase then break;
        Result:=Pos;
        exit;
        end
      end
    end;
  end//endfor
       else
  begin
  for Pos:=Start-l+1 downto 1 do
    begin
    i:=0;
    while ANSICompareText(P[l-i],Text[Pos-i])=0 do
      begin
      inc(i);
      //inc(count);
      if i=l then
        begin
        //Проверка на слово целиком
        if FullWord then
          if not CheckFullWord then break;
        //Проверка на соответствие регистру
        if MatchCase then
          if not CheckCase then break;
        Result:=Pos-l+1;
        exit;
        end
      end;
    end;
  end;
Result:=-1;
end;

end.


Кстати, Fwd можно сделать целочисленным и давать ему 1 и -1, а вместо двух for использовать один while прибавляя к счетчику в каждой итерации Fwd. Странно, что я тогда не додумался.

Автор: GELEAF 12.1.2007, 22:25
Всем спасибо.вы мне очень помогли.
Тему можно закрыть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)