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

时间:2012-04-24 11:34:58

标签: c# regex plural

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

所以我可以这样做......

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

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

3 个答案:

答案 0 :(得分:9)

您可能遇到的问题是,有许多不规则的名词,例如manfishindex。因此,您应该考虑使用具有PluralizationService方法的PluralizeHere是一个展示如何使用它的示例。

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

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

答案 1 :(得分:2)

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

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

Demo & source

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

答案 2 :(得分:0)

如果您使用SQL Server作为后端,则无法使用Soundex?我不确定你要搜索什么。我假设您正在尝试创建动态SQL作为搜索输入。如果没有,我认为有LINQ的SoundEx。

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

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

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

这是我跑步的一个例子

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服务器,使用Contains / FreeText / ContainsTable等对目录使用SoundEx(我不熟悉SQL Server的新版本 - 回到我使用过的SQLServer 2000实现),你也可以对你的结果

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

对Pluralization解决方案的关注,您必须能够使用.Net 4.

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

相关问题