поиск текста, точ в точ (Delphi-7)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by .:TrEaDoN:., 19 Jul 2015.

  1. .:TrEaDoN:.

    .:TrEaDoN:. New Member

    Joined:
    31 May 2015
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Привет всем), вот в чем вопрос, я ищу слово методом pos и если в слове не хватает одного символа, то он все равно думает что это искомое слово, нужно что бы он искал точ в точ то слово которое нужно и с учётом регистра. Что можете предложить?
     
  2. i~DOS

    i~DOS Member

    Joined:
    26 Mar 2009
    Messages:
    42
    Likes Received:
    40
    Reputations:
    4
    Для начала ознакомиться с алгоритмами поиска подстроки в строке, а потом закодить алгоритм Бойера-Мура(или найти готовую реализацию, как больше нравится).

    up: если имеется в виду поиск целого слова в предложении, то всё гораздо проще. Pos возвращает индекс первого символа подстроки в искомой строке, следовательно нужно добавить проверку символов pos-1 и pos+длина_подстроки+1, чтобы они не являлись буквенными.
     
    #2 i~DOS, 19 Jul 2015
    Last edited: 19 Jul 2015
    yarbabin likes this.
  3. .:TrEaDoN:.

    .:TrEaDoN:. New Member

    Joined:
    31 May 2015
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    , я просто ищу методом pos в тексте, это не надёжно, пример покажи этого -( проверку символов pos-1 и pos+длина_подстроки+1,) пжлст
     
  4. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Создай динамический массив, размером в искомый текст и через вложенный цикл, посимвольно сравнивай с данным текстом. Что сложного то? В гугле все есть
     
  5. .:TrEaDoN:.

    .:TrEaDoN:. New Member

    Joined:
    31 May 2015
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    это не совсем то вроде, покажи как, не понимаю
     
  6. RedPro

    RedPro Banned

    Joined:
    30 Jul 2013
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Функцию PosEx - эта функция есть в модуле StrUtils я её от туда взял и не много переписал.
    Лови исходник:
    Code:
    var
      Form1: TForm1;
      List:TStringList;
    
    implementation
    
    {$R *.dfm}
    
    function ReadTxt(FileName:string):string;
    var
    FS : TFileStream;
    begin
    Result:='';
    if FileExists(FileName) then
      begin
       FS := TFileStream.Create(FileName, fmOpenRead);
       FS.Seek(0,soFromBeginning);
       SetLength(Result,FS.Size);
       FS.ReadBuffer(Pointer(Result)^, FS.Size);
       FS.Free;
      end;
    end;
    
    function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
    var
      I,X: Integer;
      Len, LenSubStr: Integer;
    begin
      if Offset = 1 then
        Result := Pos(SubStr+' ', S)
      else
      begin
        I := Offset+LenSubStr;
        LenSubStr := Length(SubStr+' ');
        Len := Length(S) - LenSubStr + 1;
        while I <= Len do
        begin
          if S[I] = SubStr[1] then
          begin
            X := 1;
            while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
              Inc(X);
            if (X = LenSubStr) then
            begin
              Result := I;
              exit;
            end;
          end;
          Inc(I);
        end;
        Result := 0;
      end;
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    List.Text:=ReadTxt(sFilenameEdit1.Text);
    if PosEx(Edit1.Text, List.Text)<>0 then
    ShowMessage('Найдено: '+Edit1.Text)
    else
    ShowMessage('Не нашлось');
    end;
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    List:=TStringList.Create;
    end;
    
    end.
    Исходник