« Raspberry Pi + mplayerネットラジオを聴いてみる | トップページ | Raspberry Pi (ラズベリーパイ)起動時にStartpar: service(s) returned failure: gdomap failed:ってエラーが出る »

2014-12-18

VCLのTStringsを検索キーワードのトークナイザー的に使ってみる

8e0db9690b4151a5dfbe4658f929cdba_s

取り敢えず、検索キーワードは、全角、半角のスペース区切りという事にします。

で二重引用符でくくられた範囲は、ひとつのキーワードとする事にします。

TStringsにはStrictDelimiterというプロパティがあります。

このプロパティを使用して,Delimiter が DelimitedText プロパティ内で使用される唯一の値かどうかを指定します。True に設定されている場合,DelimitedText 内の各文字列は,Delimiter の値の文字だけで区切られます。False に設定されている場合は,DelimitedText 内の各文字列をスペース,非表示文字,または Delimiter の値の文字で区切ることができます。

ということだそうで、StrictDelimiterをfalseにしておけば、スペース、非表示文字は自動的に区切り文字として認識してくれます。という訳で、全角のスペースを区切り文字にしてみました。AnsiString時代は全角の空白は文字列になってしまい、Delimiterとして指定する事ができず、全角を半角に置換するなどの処理が必要でしたが、UnicodeStringになってからはL' 'という風に一重引用符で全角スペースをくくって渡す事ができるようになって楽になりました。ユーザーは自分が入力したスペースが全角なのか半角なのかわかっていない人がたくさんいますし、「全角だろうが半角だろうがスペースはスペースだ!」という感じです。

void __fastcall tokenize_keyword(String keyword_string)
{
    boost::shared_ptr<TStrings> keywords(new TStringList());
    keywords->Delimiter = L' ';
    keywords->QuoteChar = L'\"';
    keywords->StrictDelimiter = false;
    keywords->DelimitedText = keyword_string;

    for (int i = 0; i < keywords->Count; ++i)
    {
        ShowMessage(keywords->Strings[i]);
    }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    tokenize_keyword(Edit1->Text);
}

こんな感じでやってみるとEdit1にGoogleで検索するみたいにスペース区切りのキーワードを羅列して、全角で区切ったり、半角で区切ったり、スペースを含むキーワードを二重引用符でくくったりしてButton1をクリックすると、それぞれのキーワードに切り分けた物をダイアログで表示します。

データベースなんかでは、この切り分けた、ひとつのキーワードを各フィールドの検索条件としてOR検索して、更に別のキーワードとAND検索をさせれば良さそうです。SQLはゴチャゴチャしそうですけど。


Delphi XE2プログラミング入門




|

« Raspberry Pi + mplayerネットラジオを聴いてみる | トップページ | Raspberry Pi (ラズベリーパイ)起動時にStartpar: service(s) returned failure: gdomap failed:ってエラーが出る »

CBuilder」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: VCLのTStringsを検索キーワードのトークナイザー的に使ってみる:

« Raspberry Pi + mplayerネットラジオを聴いてみる | トップページ | Raspberry Pi (ラズベリーパイ)起動時にStartpar: service(s) returned failure: gdomap failed:ってエラーが出る »