需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配

Posted

技术标签:

【中文标题】需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配【英文标题】:Need c# regex to match any word in comma list with any word within another string 【发布时间】:2018-04-16 23:02:55 【问题描述】:

我无法弄清楚或找到已回答的问题。我有一个逗号分隔格式的关键字列表。我想在一个字符串中搜索逗号列表中任何单词的匹配项。有人可以帮忙吗?示例代码:

string searchString = "http://www.website.com/test/?q=cats and dogs"; 
string keywords = "cats, dogs, whales, fish";
bool match = Regex.IsMatch(searchString , "xxxx");  // Need the regex string here
Console.WriteLine(match)

输出:真(因为猫和狗都在引用字符串中找到

我似乎无法弄清楚这一点。请帮忙。

【问题讨论】:

关键字字符串是否在您的控制之下?如果是这样,为什么不提供适当的正则表达式而不是逗号分隔的列表?如果这是您需要的,我可以发布一个具体的答案... 关键字将来自数据库表字段。该字段有一个逗号列表。我想看看是否有任何关键字与 searchString 中的任何单词匹配。谢谢您的回复! @Richardissimo "该字段有一个逗号列表。"然后你还有其他问题,因为如果一个值包含逗号,则需要对其进行转义。考虑normalising您的数据以避免这种情况。 我有一定的限制,无法正常化。有没有办法用正则表达式找到 match=true ?请问?? 您在问一个“XY”问题。也就是说,您对如何解决问题(一个正则表达式)有一些想法,并且专注于该解决方案。这可能不是正确的解决方案!有许多可能比正则表达式更好的解决方案。 【参考方案1】:

我不在电脑前,所以这是即兴的,请记住我在 cmets 中关于标准化和处理 CSV 数据的风险的免责声明,但是...

var parts= keywords.Split(',').Select(x=>Regex.Escape(x.Trim()));
var pattern= "(" +string.Join("|" , parts) + ")";
var regex=new Regex(pattern);
bool match=regex.IsMatch(searchString);

您可能需要通过将 @"\W" 像这样放在模式字符串的开头和结尾来使其更强大(以避免错误匹配)...

var pattern= @"\W(" +string.Join("|" , parts) + @")\W";

为了满足字符串开头和结尾的匹配,让它..

var pattern= @"(^|\W)(" +string.Join("|" , parts) + @")(\W|$)";

或者,感谢 Johnbot:

var pattern= @"\b(" +string.Join("|" , parts) + @")\b";

【讨论】:

这很接近了。谢谢!有没有办法只匹配整个单词?例如,如果我的关键字文本是“og,rat”,它会返回 true,但我只希望它在匹配关键字列表中的整个单词“dog”时返回 true。换句话说,我只希望在搜索字符串中找到逗号之间的整个短语。再次感谢 Richardissimo! @HarrisStephanie spooky,我只是为此编辑它。 我必须删除字符串末尾的 \W 以获得首选输出。这是一个很大的帮助!再次感谢 Richardissimo。 @HarrisStephanie 刚刚再次编辑,因为我猜如果单词在字符串的末尾它不匹配。 使用单词边界 \b 而不是非单词 \W。它处理字符串的开始/结束和许多其他情况。

以上是关于需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式查找单词的最佳匹配子集

使用正则表达式匹配多个逗号分隔的单词

在 Python 中使用正则表达式查找和替换文件中的单词列表

逗号分隔的列表正则表达式 [重复]

如何使用正则表达式过滤掉任何没有逗号的东西?

正则表达式匹配零和逗号