我希望在C#中使用正则表达式来搜索术语,我想在搜索中包含这些术语的复数形式。例如,如果用户想要搜索“管道”,那么我也想返回“管道”的结果。
所以我可以这样做......
string s ="\\b" + term + "s*\\b";
if (Regex.IsMatch(bigtext, s) { /* do stuff */ }
当用户输入“压力”并仍然为“管道”/“管道”工作时,我如何修改上述内容以允许我匹配,比如说“压力”?
答案 0 :(得分:9)
您可能遇到的问题是,有许多不规则的名词,例如man
,fish
和index
。因此,您应该考虑使用具有PluralizationService
方法的Pluralize
。 Here是一个展示如何使用它的示例。
获得该术语的复数后,您可以轻松构建一个搜索复数或单数项的正则表达式。
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
我知道这不是你需要的,但它可能会帮助你找到一些东西。
答案 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距离算法可能很有用。