我使用正则表达式来执行站点搜索。如果我搜索这个:“Millwood的别墅”(这是一个社区名称),相应的社区名称是“Millwood的别墅”,我会得到结果。
如果我搜索"Millwood villas“,结果不会显示。
我的意思是,这个短语是作为一个整体来考虑的,并且是匹配的。有没有办法匹配输入短语中单个单词的出现情况?所以“米尔伍德别墅”仍然会带来“米尔伍德别墅”的结果?
以下是我要匹配社区名称的内容:
Regex.IsMatch(MarketingCommunityName.Trim(), pattern, RegexOptions.IgnoreCase)其中MarketingCommunityName是输入的搜索短语,pattern是实际的社区名称。
提前感谢!
发布于 2012-11-01 05:18:04
虽然我认为您应该在空格处Split您的搜索模式,然后分别检查每个单词,但从您的搜索模式构造一个与顺序无关的正则表达式并不太难:
var searchWords = searchString.Trim().Split(new Char[] {' '});
string pattern = @"^(?=.*" + String.Join(@")(?=.*", searchWords) + ")";这将构造一个正则表达式,其中每个搜索词都包含一个先行断言。每个先行断言都从字符串的开头开始,并检查搜索词是否出现在字符串中的任何位置。请注意,如果您的searchString包含正则表达式元字符,那么您可能会遇到问题,因此这些元字符应该事先进行转义。
发布于 2012-11-01 05:17:48
同时找到这两种模式的正则表达式模式应该是
\bMillwood\b.*\bvillas\b其中,\b表示单词的开头或结尾,.*表示任意数量的字符。
如果你不介意找到单词的一部分,你可以去掉\b的
Millwood.*villas但是,例如,您将找不到"villas of Millwood"。此模式将
Millwood.*villas|villas.*Millwood但是,如果您希望将此搜索扩展到包含三个以上单词的模式,则Regex不是实现这种模糊逻辑的正确选择。我会计算不同的机器词的数量,并返回产生最小计数的短语。(可能至少有60%的给定单词。)
发布于 2012-11-01 05:30:32
拆分词组并检查每个单词
pattern.Split(' ')
.All(word=>Regex.IsMatch(MarketingCommunityName.Trim(), word, RegexOptions.IgnoreCase)https://stackoverflow.com/questions/13167416
复制相似问题