VCLのTStringsを検索キーワードのトークナイザー的に使ってみる
取り敢えず、検索キーワードは、全角、半角のスペース区切りという事にします。
で二重引用符でくくられた範囲は、ひとつのキーワードとする事にします。
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はゴチャゴチャしそうですけど。
| 固定リンク
« Raspberry Pi + mplayerネットラジオを聴いてみる | トップページ | Raspberry Pi (ラズベリーパイ)起動時にStartpar: service(s) returned failure: gdomap failed:ってエラーが出る »
「CBuilder」カテゴリの記事
- 一定時間アイドル状態が続いたら何かをしたい(2015.11.26)
- TMetafileへの描画が反映されない(2015.07.30)
- TDataModuleはClientHeightプロパティを持っていない(2015.02.19)
- VCLのTStringsを検索キーワードのトークナイザー的に使ってみる(2014.12.18)
- Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する(2014.12.02)
この記事へのコメントは終了しました。
コメント