2

我正在使用正则表达式来执行站点搜索。如果我搜索这个:“Villas at Millwood”(这是一个社区名称)并且相应的社区名称是“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) + ")";

这构造了一个正则表达式,每个搜索词包含一个前瞻断言。每个前瞻断言都从字符串的开头开始,并查看搜索词是否出现在字符串内的任何位置。请注意,如果您searchString包含正则表达式元字符,您可能会遇到问题,所以这些可能应该事先转义。

于 2012-10-31T21:18:03.717 回答
0

找到两种模式的正则表达式模式将是

\bMillwood\b.*\bvillas\b

where\b表示单词的开头或结尾,.*代表任意数量的字符。

如果你不介意找词的一部分,你可以去掉\b's

Millwood.*villas

"villas of Millwood"但是,例如,您不会找到。这种模式将

Millwood.*villas|villas.*Millwood

但是,如果您想将此搜索扩展到包含三个以上单词的模式,Regex 不是实现这种模糊逻辑的正确选择。我会计算不同的匹配词的数量并返回产生最小计数的短语。(可能至少有 60% 的给定单词。)

于 2012-10-31T21:17:48.087 回答
0

拆分短语并检查每个单词

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