Delphiは、リストに除外キーワードを見つけるSTRINGLIST
-
19-09-2019 - |
質問
私は私が働いている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を使用している場合、Pos
にAnsiPos
からそれを変更します。ここでの私の仮定がsoWholeWordマッチ「魚」は「魚スティック」ではなく「ナマズ」にマッチすることを意味していることである。