1

Google がドキュメントのキーワードを検索する方法と同様に、文字列を比較するプログラムを C# で作成しています。

「スタック オーバーフロー」の検索で、「スタック オーバーフロー」(プレーン)、「これはスタック オーバーフローです」に対して true を返すようにしたいと考えています。(中央)、「スタック オーバーフローへようこそ」。(大文字と小文字を区別しない)、「スタック オーバーフローが好きです。」(変数の空白)、および「スタック オーバーフローにダッシュを入れるのは誰ですか?」ですが、「stackoverflow」ではありません(空白なし)。

「stack([ -]|. )+overflow」のような正規表現を使用できると考えていましたが、各キーワードのすべてのスペースを新しいキーワードごとに文字セットに置き換える必要があるのはやり過ぎのようです。検索する文字列は「スタック オーバーフロー」だけではないため、実用的に行う必要があります。

4

3 に答える 3

1

仕様を満たすために、最初に行うことができます

newSearchString = Regex.Replace(Regex.Escape(searchString), @"\s+", @"[\s\p{P}]+");

(プレーンテキストの検索文字列を正規表現に変換し、以前は空白しかなかった場所でも句読点を使用できるようにします)、検索しているテキストにその正規表現を適用します.

しかしもちろん、これはわずかなタイプミスでも一致しませんが、Levensthein 距離を使用するアルゴリズムは「Stak Overfloor」にも一致します。

于 2010-09-30T06:49:37.547 に答える
1

言及した特定のケースで効果を達成したいだけの場合は、正規表現を使用して、無視するトークンを単一のスペース (または空の文字列) に置き換えることができます。

より複雑なソリューションが必要な場合は、動的計画法を使用して、最初の文字列を 2 番目の文字列に変換するために必要な最小の順列を取得できます。これにより、(少数の) 文字の欠落やタイプミスとの照合も可能になります。

于 2010-09-30T00:23:04.583 に答える
0

短い文字列と比較している場合、私が見ることができる最も簡単な方法は、両方の文字列からすべての空白とその他の文字を取り除き、単純なstring.Contains.

于 2010-09-30T00:52:00.983 に答える