我希望在 C# 中使用正则表达式来搜索术语,并且我想在搜索中包含这些术语的复数。例如,如果用户想要搜索“管道”,那么我也想返回“管道”的结果。
所以我可以这样做...
string s ="\\b" + term + "s*\\b";
if (Regex.IsMatch(bigtext, s) { /* do stuff */ }
当用户输入“压力”并且仍然为“管道”/“管道”工作时,我将如何修改上述内容以允许我匹配“压力”?
您可能面临的问题是有很多不规则名词,例如man
,fish
和index
。所以你应该考虑使用PluralizationService
that has a Pluralize
method。这是一个显示如何使用它的示例。
获得该术语的复数后,您可以轻松构建一个搜索复数或单数术语的正则表达式。
PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture);
string plural = ps.Pluralize(term);
string s = @"("+term+"|"+plural+")";
if (Regex.IsMatch(bigtext, s)) {
/* do stuff */
}
这是为删除复数而创建的正则表达式:
/(?<![aei])([ie][d])(?=[^a-zA-Z])|(?<=[ertkgwmnl])s(?=[^a-zA-Z])/g
(演示和源代码)
我知道这并不完全是您所需要的,但它可能会帮助您找到一些东西。
如果您使用 SQL 服务器作为后端,您不能使用 Soundex 吗?我不确定您要搜索什么。我假设您正在尝试创建动态 SQL 作为搜索输入。如果不是,我认为 LINQ 有 SoundEx。
编辑:我的立场得到纠正,似乎有一些 linq to sql 实体的东西可以为 SoundEx 完成。
但是,MSDN 确实有一个 soundex 示例,对于我今天早上运行的简单测试,就我测试的内容而言,它似乎做得很好。 http://msdn.microsoft.com/en-us/library/bb669073.aspx
我所做的更改不是 .ToUpper(invariant) 我使用了 .ToUpperInvariant() 而不是传递 (string word) 我使用了扩展方法 (this string word)
这是我运行的示例
List<string> animals = new List<string>();
animals.Add("dogs");
animals.Add("dog");
animals.Add("cat");
animals.Add("rabbits");
animals.Add("doggie");
string dog = "dog";
var data = from animal in animals
where animal.SoundEx() == dog.SoundEx()
select animal;
数据:狗,狗,小狗
现在使用 SQL Server,使用 Contains/FreeText/ContainsTable 等并针对目录使用 SoundEx(我不熟悉 SQL Server 的较新版本 - 回到我使用的 SQLServer 2000 实现),您还可以对结果进行排名。
此外,如果您有能力使用 sql server,您可能需要查看此选项: LINQ to SQL SOUNDEX - possible?
与 Pluralization 解决方案有关,您必须能够使用 .Net 4。
还有可能有用的 Levenshtein 距离算法。