8

我希望在 C# 中使用正则表达式来搜索术语,并且我想在搜索中包含这些术语的复数。例如,如果用户想要搜索“管道”,那么我也想返回“管道”的结果。

所以我可以这样做...

string s ="\\b" + term + "s*\\b";
if (Regex.IsMatch(bigtext, s) {  /* do stuff */ }

当用户输入“压力”并且仍然为“管道”/“管道”工作时,我将如何修改上述内容以允许我匹配“压力”?

4

3 回答 3

9

您可能面临的问题是有很多不规则名词,例如man,fishindex。所以你应该考虑使用PluralizationServicethat has a Pluralizemethod。是一个显示如何使用它的示例。

获得该术语的复数后,您可以轻松构建一个搜索复数或单数术语的正则表达式。

PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture);
string plural = ps.Pluralize(term);
string s = @"("+term+"|"+plural+")";
if (Regex.IsMatch(bigtext, s)) {
    /* do stuff */
}
于 2012-04-24T11:55:02.100 回答
2

这是为删除复数而创建的正则表达式:

 /(?<![aei])([ie][d])(?=[^a-zA-Z])|(?<=[ertkgwmnl])s(?=[^a-zA-Z])/g

演示和源代码

我知道这并不完全是您所需要的,但它可能会帮助您找到一些东西。

于 2012-04-24T11:42:24.153 回答
0

如果您使用 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 距离算法。

于 2012-04-24T11:53:06.077 回答