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升级,所以我不得不另辟蹊径。

C#中的奇异化

关于使用微软库的SLaks建议。

PluralizationService ps = PluralizationService.CreateService(CultureInfo.CurrentCulture);
var word = "levels";
if (ps.IsPlural(word)) word = ps.Singularize(word);

我认为问题是(.*)ves?应该在末尾有一个$,所以它与级别的leve ls部分不匹配。

相关文章:
  • 没有找到相关文章