C#中的奇异化
本文关键字: | 更新日期: 2023-09-27 18:27:27
我发现了一个有趣的奇点类,它运行得很好,但我遇到了一个问题,由于我对正则表达式不太了解,似乎不知道如何解决这个问题。
给定以下内容:
private static readonly IDictionary<string, string> Singularizations =
new Dictionary<string, string>
{
{"people", "person"},
{"oxen", "ox"},
{"children", "child"},
{"feet", "foot"},
{"teeth", "tooth"},
{"geese", "goose"},
{"(.*)ives?", "$1ife"},
{"(.*)ves?", "$1f"},
{"(.*)men$", "$1man"},
{"(.+[aeiou])ys$", "$1y"},
{"(.+[^aeiou])ies$", "$1y"},
{"(.+)zes$", "$1"},
{"([m|l])ice$", "$1ouse"},
{"matrices", @"matrix"},
{"indices", @"index"},
{"(.+[^aeiou])ices$","$1ice"},
{"(.*)ices", @"$1ex"},
{"(octop|vir)i$", "$1us"},
{"(.+(s|x|sh|ch))es$", @"$1"},
{"(.+)s", @"$1"}
};
如果我对单词"Levels"进行测试,它会返回"Lefls",基本上与单词{"(.*)ves?", "$1f"}
不匹配
有什么方法可以为关卡添加新规则吗?我尝试添加{"(.*)els?"、"$1f"},但正则表达式验证器跳过了这一步。
更新说明:感谢所有的反馈,我看了一下新的PluralizationService,但这是专门针对.Net 4.0的,我的客户不会很快从3.5升级,所以我不得不另辟蹊径。
关于使用微软库的SLaks建议。
PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture);
var word = "levels";
if (ps.IsPlural(word)) word = ps.Singularize(word);
我认为问题是(.*)ves?应该在末尾有一个$,所以它与级别的leve
ls部分不匹配。