2

サイト検索の実行に正規表現を使用しています。「Villas at Millwood」(これはコミュニティ名) を検索し、対応するコミュニティ名が「Villas at Millwood」の場合、結果が得られます。

"Millwood villas" を検索しても、結果が表示されません。

つまり、フレーズは全体として取られ、一致します。入力されたフレーズ内の個々の単語の出現を照合する方法はありますか? "millwood Villas" が "Villas at Millwood" の結果をもたらすようにするには?

コミュニティ名と一致させる必要があるのは次のとおりです。

Regex.IsMatch(MarketingCommunityName.Trim(), pattern, RegexOptions.IgnoreCase)

pattern は入力された検索フレーズで、MarketingCommunityName は実際のコミュニティ名です。

前もって感謝します!

4

3 に答える 3

1

スペースで検索パターンを作成し、すべての単語を個別にチェックする必要があると思いますがSplit、検索パターンから順序に依存しない正規表現を構築することはそれほど難しくありません。

var searchWords = searchString.Trim().Split(new Char[] {' '});

string pattern = @"^(?=.*" + String.Join(@")(?=.*", searchWords) + ")";

これにより、検索語ごとに 1 つの先読みアサーションを含む正規表現が構築されます。各先読みアサーションは文字列の先頭から開始し、検索語が文字列内のどこかに現れるかどうかを調べます。searchString正規表現のメタ文字が含まれていると問題が発生する可能性が高いため、これらは事前にエスケープする必要があることに注意してください。

于 2012-10-31T21:18:03.717 に答える
0

フレーズを分割し、すべての単語をチェックします

pattern.Split(' ')
    .All(word=>Regex.IsMatch(MarketingCommunityName.Trim(), word, RegexOptions.IgnoreCase)
于 2012-10-31T21:30:32.487 に答える
0

両方のパターンを見つける正規表現パターンは次のようになります

\bMillwood\b.*\bvillas\b

where\bは単語の先頭または末尾を.*表し、任意の数の文字を表します。

単語の一部を見つけてもかまいません。\b'sを削除できます

Millwood.*villas

"villas of Millwood"ただし、たとえば見つかりません。このパターンは

Millwood.*villas|villas.*Millwood

しかし、この検索を 3 つ以上の単語からなるパターンに拡張したい場合、正規表現はこの種のファジー ロジックを実装するための正しい選択ではありません。一致する個別の単語の数を数え、最小数のフレーズを返します。(おそらく、与えられた単語の少なくとも 60% を持っています。)

于 2012-10-31T21:17:48.087 に答える