首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式用于匹配短语中的单个单词

正则表达式用于匹配短语中的单个单词
EN

Stack Overflow用户
提问于 2012-11-01 05:05:33
回答 3查看 280关注 0票数 2

我使用正则表达式来执行站点搜索。如果我搜索这个:“Millwood的别墅”(这是一个社区名称),相应的社区名称是“Millwood的别墅”,我会得到结果。

如果我搜索"Millwood villas“,结果不会显示。

我的意思是,这个短语是作为一个整体来考虑的,并且是匹配的。有没有办法匹配输入短语中单个单词的出现情况?所以“米尔伍德别墅”仍然会带来“米尔伍德别墅”的结果?

以下是我要匹配社区名称的内容:

代码语言:javascript
复制
Regex.IsMatch(MarketingCommunityName.Trim(), pattern, RegexOptions.IgnoreCase)

其中MarketingCommunityName是输入的搜索短语,pattern是实际的社区名称。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-01 05:18:04

虽然我认为您应该在空格处Split您的搜索模式,然后分别检查每个单词,但从您的搜索模式构造一个与顺序无关的正则表达式并不太难:

代码语言:javascript
复制
var searchWords = searchString.Trim().Split(new Char[] {' '});

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

这将构造一个正则表达式,其中每个搜索词都包含一个先行断言。每个先行断言都从字符串的开头开始,并检查搜索词是否出现在字符串中的任何位置。请注意,如果您的searchString包含正则表达式元字符,那么您可能会遇到问题,因此这些元字符应该事先进行转义。

票数 1
EN

Stack Overflow用户

发布于 2012-11-01 05:17:48

同时找到这两种模式的正则表达式模式应该是

代码语言:javascript
复制
\bMillwood\b.*\bvillas\b

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

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

代码语言:javascript
复制
Millwood.*villas

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

代码语言:javascript
复制
Millwood.*villas|villas.*Millwood

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

票数 0
EN

Stack Overflow用户

发布于 2012-11-01 05:30:32

拆分词组并检查每个单词

代码语言:javascript
复制
pattern.Split(' ')
    .All(word=>Regex.IsMatch(MarketingCommunityName.Trim(), word, RegexOptions.IgnoreCase)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13167416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档