在C#中使用正则表达式匹配复数

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

所以我可以这样做……

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

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

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

  /(? 

( 演示和来源 )

我知道这不是你需要的,但它可以帮助你找到一些东西。

你可能面临的问题是,有很多不规则的名词,如manfishindex 。 因此,您应该考虑使用具有Pluralize方法的Pluralize 。 这是一个显示如何使用它的示例。

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

 PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture); string plural = ps.Pluralize(term); string s = @"("+term+"|"+plural+")"; if (Regex.IsMatch(bigtext, s)) { /* do stuff */ } 

如果你使用SQL服务器作为后端,你不能使用Soundex吗? 我不确定你要搜索什么。 我假设您正在尝试创建动态SQL作为搜索输入。 如果不是,我认为有LINQ的SoundEx。

编辑:我站得更正,似乎有一些linq to sql实体的东西可以为SoundEx完成。

但是,MSDN确实有一个soundex示例,对于我今天早上运行的简单测试似乎就我测试的情况做得很好。 http://msdn.microsoft.com/en-us/library/bb669073.aspx

我做的改变是代替.ToUpper(不变)我使用.ToUpperInvariant()而不是传递(字符串字)我使用了扩展方法(这个字符串字)

这是我跑的一个例子

 List animals = new List(); 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服务器,使用Contains / FreeText / ContainsTable等并对目录使用SoundEx(我不熟悉SQL Server的新版本 – 回到我使用的SQLServer 2000实现),您也可以对结果进行排名。

此外,如果您有能力使用sql server,您可能需要查看此选项: LINQ to SQL SOUNDEX – 可能吗?

对Pluralization解决方案的关注,你必须能够利用.Net 4。

还有Levenshtein距离算法可能有用。