質問

私は私が働いている2つの文字列のリストを持っています。キーワードのリストを持っているし、別の除外キーワードのリストを持っていることの一つ。私は、リストを検索し、第三キーワードリストに除外キーワードと出力を含まないリスト項目を選ぶことができるようにしたいです。私はAnsiPos機能を使用していたが、彼らは完全な単語対、単語の一部であった場合には、除外キーワードを見つけます。

これを行うには、比較的簡単な方法で

任意の提案ですか?スピードはそれほど重要ではありませんが、いいだろう。

を私はしているよ何の例:

キーワード一覧ます:

Cat 
Catfish
Fish Sticks
Dog Food

除外キーワード一覧ます:

Fish

戻り値は募集ます:

Cat 
Catfish
Dog Food

これは私がこれまで..動作しない持っているものです。効率的な全体のワード検索があるの:私はからの情報を使用しましたDelphiで機能ですか

function ExistWordInString(aString: PAnsichar; aSearchString: string;
  aSearchOptions: TStringSearchOptions): Boolean;
var
  Size : Integer;
begin
  Size := StrLen(aString);
  result := SearchBuf(aString, Size, 0, 0, aSearchString, aSearchOptions) <> nil;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  i, j, index: integer;
  s: string;
  stl: tstringlist;
begin
  stl := TStringList.Create;
  stl.Text := listbox1.Items.Text;
  for I := 0 to stl.Count - 1 do
  begin
    for j := 0 to listbox2.Count - 1 do
    begin
      if not ExistWordInString(PAnsiChar(listbox2.Items.Strings[j]),
        listbox1.Items.Strings[i], [soWholeWord, soDown])
      then
        listbox3.Items.Append(stl.Strings[i]);
    end;
  end;
end;
役に立ちましたか?

解決

このサンプル・コードは、魔法のように動作(デルファイ7を使用して)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, StrUtils;

type
  TForm1 = class(TForm)
  Button1: TButton;
  ListBox1: TListBox;
  ListBox2: TListBox;
  ListBox3: TListBox;
  procedure Button1Click(Sender: TObject);

  private
     function ExistWordInString(aString, aSearchString:string;aSearchOptions: TStringSearchOptions): Boolean;

  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
    i,k: integer;

begin

    for k:= 0 to ListBox2.Count -1 do
        for i:= 0 to ListBox1.Count - 1 do
        begin
            if not ExistWordInString(ListBox1.Items[i], ListBox2.Items[k],[soWholeWord,soDown]) then
                ListBox3.Items.Append(ListBox1.Items[i]);
        end;

end;

function TForm1.ExistWordInString(aString, aSearchString: string; aSearchOptions: TStringSearchOptions): Boolean;
var
  Size : Integer;

begin
        Size:=Length(aString);
        Result := SearchBuf(PChar(aString), Size, 0, 0, aSearchString, aSearchOptions)<>nil;

end;
end.    

、ここでは、フォームの

object Form1: TForm1
  Left = 1008
  Top = 398
  Width = 411
  Height = 294
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 320
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object ListBox1: TListBox
    Left = 8
    Top = 8
    Width = 177
    Height = 97
    ItemHeight = 13
    Items.Strings = (
      'Cat '
      'Catfish'
      'Fish Sticks'
      'Dog Food')
    TabOrder = 1
  end
  object ListBox2: TListBox
    Left = 192
    Top = 8
    Width = 121
    Height = 97
    ItemHeight = 13
    Items.Strings = (
      'Fish')
    TabOrder = 2
  end
  object ListBox3: TListBox
    Left = 8
    Top = 112
    Width = 305
    Height = 137
    ItemHeight = 13
    TabOrder = 3
  end
end

は、このことができます願っています。

ラインハルト: - )

他のヒント

あなたは、あなたがの両方のキーワードと除外キーワード、すなわち前後にスペースを追加することにより、AnsiPosを使用して単語全体の一致を行うことができますが、心配する必要は区切りスペースが唯一の単語であれば

AnsiPos( '+ SUBSTR +''、 ' '+筋力+'')

あなたはネガティブキーワードリストからすべてのエントリをチェックするループを必要があると思います。

<デル>私は、私はそれを考え出したと思います。 stringlist.find(「魚」、インデックス)を使用します。

私はそれを理解しませんでした。 .find動作しませんでした。

-Brad

あなたはSearchBuf機能を使用することができます(pastacoolの回答を参照してください)のIFのあなたはA..Z /ユニコード以外の文字で、のないの興味を持っています。

あなたはUnicodeのデルファイ(D2009やD2010)を持っているなら、あなたは、のTCharacter.IsLetterOrDigit(aStringの:文字列;のaindex:整数)を:使用しなければならないブール; の文字のから単位。あなたのアイデアを取得するための簡単な例:

procedure TForm7.btn1Click(Sender: TObject);
var
  bMatches: boolean;

begin
  with rgx1 do //custom component - disregard it
  begin
    RegEx:=edtTextToFind.Text; //text to find
    Subject:=mmoResult.Text; //text in which to search
    if Match then //aha! found it!
    begin
      bMatches:=True;
      if chkWholeWord.Checked then //be attentive from here!! - I think that's self explaining...
      begin
        if MatchedExpressionOffset>1 then
          bMatches:=not TCharacter.IsLetterOrDigit(Subject, MatchedExpressionOffset-1);
        if bMatches and (MatchedExpressionOffset+MatchedExpressionLength<=Length(Subject)) then
          bMatches:=not TCharacter.IsLetterOrDigit(Subject, MatchedExpressionOffset+MatchedExpressionLength);
      end;
      if bMatches then //select it in the memo
      begin
        mmoResult.SelStart:=MatchedExpressionOffset-1;
        mmoResult.SelLength:=MatchedExpressionLength;
        mmoResult.SetFocus;
      end
      else
        ShowMessage('Text not found!');
    end
    else
      ShowMessage('Text not found!');
  end;
end;

読むためにあなたの関数を変更します:

function ExistWordInString(aString:PAnsichar;
   aSearchString:string;
   aSearchOptions: TStringSearchOptions): Boolean;
var 
  b : boolean;
begin
  if soWholeWord in aSearchOptions then
    b := Pos(' '+Uppercase(aSearchString)+' ',' '+UpperCase(aString)+' ') > 0;
  else
    b := Pos(UpperCase(aSearchString),UpperCase(aString)) > 0;
  Result := b;
end;

あなたは、Delphi 2009/2010を使用している場合、PosAnsiPosからそれを変更します。ここでの私の仮定がsoWholeWordマッチ「魚」は「魚スティック」ではなく「ナマズ」にマッチすることを意味していることである。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top