如何在Humanizr.net中添加忽略词/缩写,实现自定义句子大小写转换
实现Humanizr.net保留指定文本格式的解决方案
好问题!Humanizr.net提供了灵活的自定义配置能力,完全可以实现让特定内容(比如你示例中的"aBC")保持原有格式,不受句子大小写转换的影响。下面给你两种实用的实现方式:
方法一:自定义Humanize设置(快速实现)
你可以通过Humanize方法的重载,传入自定义的IHumanizeSettings来控制单词的处理逻辑,核心是利用WordFormatter委托来拦截并保留指定的词。
示例代码如下:
// 定义需要保留原格式的词集合 var preserveWords = new HashSet<string> { "aBC" }; // 创建自定义Humanize配置 var customSettings = new HumanizeSettings { // 基础转换规则:句子大小写 Transform = To.SentenceCase, // 自定义单词处理逻辑 WordFormatter = (word) => { // 如果当前单词是需要保留的词,直接返回原内容 if (preserveWords.Contains(word)) { return word; } // 其他单词按照正常逻辑转小写(配合句子首字母大写) return word.Humanize(To.LowerCase); } }; // 测试你的字符串集合 List<string> mystrings = new List<string>(); mystrings.Add("my string one"); mystrings.Add("my string two aBC"); mystrings.Add("My String Three"); foreach (string x in mystrings) { Console.WriteLine(x.Humanize(customSettings)); }
运行这段代码后,你会得到期望的输出:
My string one
My string two aBC
My string three
扩展:支持大小写不敏感匹配
如果需要匹配的词不区分大小写(比如不管输入是"aBC"、"ABC"还是"abc"都要保留原格式),可以修改HashSet的初始化方式:
// 初始化时指定忽略大小写的比较器 var preserveWords = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "abc" };
这样不管原字符串中的目标词是什么大小写形式,都会被识别并保留原格式。
方法二:全局自定义Humanizer实例(适合大型项目)
如果你的项目中需要全局统一应用这个规则,可以自定义IHumanizer实例并注册到依赖注入容器中(如果使用DI的话),这样所有地方调用Humanize都会自动应用规则。示例代码大致如下:
// 创建自定义Humanizer配置 var config = new HumanizerConfiguration(); config.WordFormatter = (word) => { var preserveWords = new HashSet<string> { "aBC" }; return preserveWords.Contains(word) ? word : word.Humanize(To.LowerCase); }; config.DefaultTransform = To.SentenceCase; // 创建自定义IHumanizer实例 var customHumanizer = new Humanizer(config); // 注册到DI容器(以ASP.NET Core为例) services.AddSingleton<IHumanizer>(customHumanizer);
之后在项目中通过依赖注入获取IHumanizer实例,调用其Humanize方法即可自动应用规则。
内容的提问来源于stack exchange,提问作者fox909a




