匹配在C#中使用正则表达式的复数(Matching plurals using regex in C

2019-09-16 16:41发布

我期待使用正则表达式在C#中搜索方面,我想在搜索中包括这些术语的复数。 例如,如果用户想要搜索“管”,那么我想为“管道”返回结果为好。

因此,我可以做到这一点...

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

我将如何修改上面让我配合,比如说,“讲”当用户输入“压力”和“管” /“管道”仍然有效?

Answer 1:

下面是创建删除复数正则表达式:

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

( 演示&源 )

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



Answer 2:

你可以面对的问题是,有很多不规则的名词如manfishindex 。 所以,你应该考虑使用PluralizationService具有Pluralize方法。 这里展示了如何使用它的一个例子。

当您得到这个词的复数,你可以轻松地构建一个正则表达式,搜索两个复数或单数名词。

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


Answer 3:

如果使用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中。

也有可能是有用的莱文斯坦距离算法。



文章来源: Matching plurals using regex in C#
标签: c# regex plural