我期待使用正则表达式在C#中搜索方面,我想在搜索中包括这些术语的复数。 例如,如果用户想要搜索“管”,那么我想为“管道”返回结果为好。
因此,我可以做到这一点...
string s ="\\b" + term + "s*\\b";
if (Regex.IsMatch(bigtext, s) { /* do stuff */ }
我将如何修改上面让我配合,比如说,“讲”当用户输入“压力”和“管” /“管道”仍然有效?
我期待使用正则表达式在C#中搜索方面,我想在搜索中包括这些术语的复数。 例如,如果用户想要搜索“管”,那么我想为“管道”返回结果为好。
因此,我可以做到这一点...
string s ="\\b" + term + "s*\\b";
if (Regex.IsMatch(bigtext, s) { /* do stuff */ }
我将如何修改上面让我配合,比如说,“讲”当用户输入“压力”和“管” /“管道”仍然有效?
下面是创建删除复数正则表达式:
/(?<![aei])([ie][d])(?=[^a-zA-Z])|(?<=[ertkgwmnl])s(?=[^a-zA-Z])/g
( 演示&源 )
我知道这不是正是你需要的,但它可以帮助你找到的东西出来。
你可以面对的问题是,有很多不规则的名词如man
, fish
和index
。 所以,你应该考虑使用PluralizationService
具有Pluralize
方法。 这里展示了如何使用它的一个例子。
当您得到这个词的复数,你可以轻松地构建一个正则表达式,搜索两个复数或单数名词。
PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture);
string plural = ps.Pluralize(term);
string s = @"("+term+"|"+plural+")";
if (Regex.IsMatch(bigtext, s)) {
/* do stuff */
}
如果使用SQL Server作为后端能不能别利用探测法? 我不确定你想搜索的内容。 我假设你正在试图创建动态SQL作为搜索输入。 如果不是我认为的SoundEx对LINQ。
编辑:我认错,似乎有一些的LINQ to SQL实体的东西,可以为SoundEx代来完成。
但是,MSDN确实有同音例子,这对于简单的测试,今天早上我跑,似乎做精至于什么我测试。 http://msdn.microsoft.com/en-us/library/bb669073.aspx
我提出的变化是代替.ToUpper(不变)我用.ToUpperInvariant()和而不是传递(串字)1中使用的扩展方法(这串字)
这里是什么,我跑了一个例子
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服务器,使用包含/ FreeText的/ CONTAINSTABLE等使用的SoundEx对目录(我不熟悉SQL服务器的新版本 - 要回SQLServer 2000的实现我用),你也可以排名结果。
此外,如果你有使用SQL Server你可能要考虑这个选项的能力: LINQ到SQL SOUNDEX -可能吗?
与多元化的解决方案的关注,你必须能够利用.NET 4中。
也有可能是有用的莱文斯坦距离算法。