ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Humanizer 的 To 静态类:基于 IStringTransformer 的字符串大小写变换指南

Humanizer 的 To 静态类:基于 IStringTransformer 的字符串大小写变换指南 开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载To是 Humanizer 中一个专注于字符串大小写变换的静态入口类它把四种常用变换小写、句首大写、标题大小写、全大写封装为可直接复用的ICulturedStringTransformer实例并提供两个Transform扩展方法让开发者能够按任意顺序组合多个变换器。阅读本文后你将掌握To.TitleCase、To.SentenceCase、To.LowerCase、To.UpperCase四个属性的行为差异与实现原理学会使用Transform对字符串做单步或链式变换并能针对土耳其语等特殊区域设置写出确定性的文化感知代码。To 类概览字符串变换的门户To是定义在 src/Humanizer/Transformer/To.cs 中的public static class官方文档将其定位为using IStringTransformer 进行字符串变换的门户portal。类本身不持有任何状态四个属性每次访问都返回同一个单例变换器实例因此可以在整个应用生命周期中安全复用public static class To { public static ICulturedStringTransformer TitleCase { get; } new ToTitleCase(); public static ICulturedStringTransformer LowerCase { get; } new ToLowerCase(); public static ICulturedStringTransformer UpperCase { get; } new ToUpperCase(); public static ICulturedStringTransformer SentenceCase { get; } new ToSentenceCase(); }从源码结构看To类的设计遵循策略对象 组合入口的模式每种变换规则被拆分为独立的内部类ToTitleCase、ToLowerCase、ToUpperCase、ToSentenceCase全部位于 src/Humanizer/Transformer 目录下To只负责暴露这些策略的单例引用并把按顺序应用多个变换器的职责收敛到两个Transform扩展方法中。这样的好处是调用方无需关心具体变换类的内部实现只需持有ICulturedStringTransformer接口即可自由替换或组合策略。变换器接口IStringTransformer 与 ICulturedStringTransformerTo的四个属性统一返回ICulturedStringTransformer理解这一类型是正确使用Transform的前提。IStringTransformer无文化感知的最小契约IStringTransformer 定义了字符串变换的最简形态——接收一个字符串返回变换后的字符串public interface IStringTransformer { string Transform(string input); }对应的 API 文档见 website/versioned_docs/version-2.14.1/api/Humanizer.IStringTransformer.md。实现该接口即可成为 Humanizer 认可的字符串变换器并可被Transform(this string, params IStringTransformer[])重载接收。ICulturedStringTransformer带文化信息的变换契约ICulturedStringTransformer 继承自IStringTransformer在无参变换之外额外增加了一个接收CultureInfo的重载public interface ICulturedStringTransformer : IStringTransformer { string Transform(string input, CultureInfo culture); }这一设计意味着所有由To暴露的变换器都内置了文化感知能力。当调用单参数Transform(string)时变换器会默认使用CultureInfo.CurrentCulture见各变换器实现中对Transform(input)的默认转发当需要确定性输出时则调用带CultureInfo的Transform(string, CultureInfo)重载显式指定文化。API 细节可参考 website/versioned_docs/version-2.14.1/api/Humanizer.ICulturedStringTransformer.md。四个变换属性行为、示例与实现To.TitleCase标题大小写To.TitleCase将每个单词的首字母大写、其余字母小写官方示例INvalid caSEs arE corrected→Invalid Cases Are Corrected实现位于 src/Humanizer/Transformer/ToTitleCase.cs是四个变换器中逻辑最复杂的一个包含两条路径ASCII 快速路径当输入全部由 ASCII 字符组成时走TryTransformAscii循环扫描避免正则开销正则回退路径一旦遇到非 ASCII 字符切换为TransformWithRegex用单词模式(\w|[^\u0000-\u007F])?\w*匹配该模式同时处理了apostrophes这类带撇号的单词。从源码可以提炼出 TitleCase 的三个关键行为规则全大写单词视为缩写原样保留如NASA and the fbi→NASA and the FbiAllCapitals/AllAsciiCapitals检查会跳过全大写单词冠词、连词、介词小写保留内置的IsArticleOrConjunctionOrPreposition维护了一个小型停用词表a, an, as, at, by, if, in, of, on, or, so, to, up, and, but, for, nor, off, the, via, yet且仅在单词不在句首时生效因此the lord of the rings→The Lord of the Rings土耳其语/阿塞拜疆语使用文化敏感大小写UsesCultureSensitiveAsciiCasing对tr、az开头的文化返回 true使其在 ASCII 快速路径中依然调用TextInfo.ToUpper/ToLower从而正确处理i/İ的映射。测试用例位于 tests/Humanizer.Tests/TransformersTests.cs 的TransformToTitleCase其中 random spaces are HONORED too → Random Spaces Are HONORED Too 证明空格结构会被原样保留rock-and-roll by night→Rock-and-Roll by Night证明连字符后的单词也会被处理。To.SentenceCase句首大写To.SentenceCase仅将字符串的第一个字符大写其余字符保持原样官方示例lower case statement→Lower case statement实现位于 src/Humanizer/Transformer/ToSentenceCase.cs。与直觉不同它不识别句号、问号等句子边界测试hello. world? yes! no→Hello. world? yes! no证明只有整个字符串开头的第一个字符会被大写。具体逻辑输入非空且首字符已是大写时直接原样返回短路否则用culture.TextInfo.ToUpper(input[0])大写首字符并拼接剩余部分空字符串直接返回原值。To.LowerCase 与 To.UpperCase全小写 / 全大写两者是四个变换器中最直接的官方示例Sentence casing→sentence casingLowerCaselower case statement→LOWER CASE STATEMENTUpperCase实现分别位于 src/Humanizer/Transformer/ToLowerCase.cs 与 src/Humanizer/Transformer/ToUpperCase.cs本质都是对culture.TextInfo.ToLower/ToUpper的封装区别仅在于大小写方向。正因如此它们天然具备文化感知能力例如在土耳其语文化下istanbul转大写会得到带点的大写İ。Transform 方法单步变换与链式组合To类提供两个Transform扩展方法定义于 src/Humanizer/Transformer/To.cs它们都遵循同一核心语义变换按传入顺序依次应用。无文化重载Transform(this string, params IStringTransformer[])public static string Transform(this string input, params IStringTransformer[] transformers);其实现是对transformers做一次Aggregate折叠将前一个变换器的输出作为后一个变换器的输入transformers.Aggregate(input, (current, stringTransformer) stringTransformer.Transform(current));由于参数是params数组可以一次传入多个变换器实现链式流水线又因为四个内置属性都是ICulturedStringTransformer即IStringTransformer的子类型它们可以直接传入本重载此时内部使用CurrentCulture。文化感知重载Transform(this string, CultureInfo, params ICulturedStringTransformer[])public static string Transform(this string input, System.Globalization.CultureInfo culture, params Humanizer.ICulturedStringTransformer[] transformers);该重载与上一版本的区别在于多了一个culture参数并且数组元素类型收窄为ICulturedStringTransformer。实现同样采用Aggregate但每次调用的是带文化的Transform(current, culture)transformers.Aggregate(input, (current, stringTransformer) stringTransformer.Transform(current, culture));它适合输出需要跨机器、跨线程保持一致性的场景。测试TransformToSentenceCaseUsesSpecifiedCulture展示了典型用法istanbul. izmir在tr-TR文化下变换为İstanbul. izmirégoïste. déjà在fr-FR文化下变换为Égoïste. déjà。链式组合实战下面演示如何用无文化重载一次性完成先转小写、再转标题大小写的两步流水线using Humanizer; var result INVALID TITLE.Transform(To.LowerCase, To.TitleCase); // 第一步INVALID TITLE - invalid title // 第二步invalid title - Invalid Title // result Invalid Title同理文化感知重载可以将特定CultureInfo贯穿整条流水线using System.Globalization; using Humanizer; var turkish new CultureInfo(tr-TR); var result istanbul is in turkey.Transform(turkish, To.TitleCase); // result İstanbul İs in Turkey对应测试 TransformToTitleCaseUsesTurkishCasing文化敏感大小写土耳其语与阿塞拜疆语的特殊处理Humanizer 对土耳其语tr与阿塞拜疆语az的大小写规则做了专门处理这是使用To类时最容易踩坑、也最值得注意的行为。相关测试位于 tests/Humanizer.Tests/TransformersTests.cs 的TransformToTitleCaseUsesTurkishCasing[Theory, UseCulture(tr-TR)] [InlineData(istanbul is in turkey, İstanbul İs in Turkey)] [InlineData(TITLE WITH I, TITLE WITH I)] public void TransformToTitleCaseUsesTurkishCasing(string input, string expectedOutput) Assert.Equal(expectedOutput, input.Transform(To.TitleCase));从ToTitleCase源码中的UsesCultureSensitiveAsciiCasing可以确认当文化名称以tr或az开头时即使输入全是 ASCII标题大小写也会走TextInfo.ToUpper/ToLower而不是做纯 ASCII 的加减偏移从而保证i → İ、I → ı这类土耳其语特有的映射正确。TransformToTitleCaseUsesCultureSensitiveLowercase测试则验证了文化感知重载对希腊语的处理输入οΣΟΣ在el-GR文化下首字符按TextInfo.ToUpper大写、其余按TextInfo.ToLower小写。因此当输出必须确定、或目标用户处于土耳其语/阿塞拜疆语区域时请优先使用带CultureInfo的Transform重载并显式传入目标文化避免依赖运行环境的CurrentCulture。从变换器到自定义规则扩展 To 的能力To的四个属性只是 Humanizer 变换能力的内置预设。文档与场景指南 website/docs/scenarios/strings-and-casing.mdx 明确指出对于请求级、局部的自定义文本规则可以实现IStringTransformer或ICulturedStringTransformer然后将其传给Transform而不必修改进程级全局配置。例如要定义一个把字符串中所有数字替换为#的局部规则using Humanizer; class DigitMasker : IStringTransformer { public string Transform(string input) string.Concat(input.Select(c char.IsDigit(c) ? # : c)); } // 组合使用先掩码数字再转为小写 var result User 42.Transform(new DigitMasker(), To.LowerCase); // result user ##由于To.Transform接受params数组自定义变换器可以与To的内置属性任意混排按书写顺序构成一条完整的处理流水线。相关可扩展性说明还可参考 website/docs/scenarios/localization-and-extensibility.mdx 中的接口对照表。小结To类是 Humanizer 字符串大小写变换的集中入口其要点可归纳为四个单例变换器TitleCase、SentenceCase、LowerCase、UpperCase均为ICulturedStringTransformer可通过To直接获取并安全复用两个组合入口Transform(string, params IStringTransformer[])与Transform(string, CultureInfo, params ICulturedStringTransformer[])变换按参数顺序依次应用文化感知贯穿始终无文化重载使用CurrentCulture带文化重载可锁定CultureInfo其中土耳其语、阿塞拜疆语、希腊语等语言的大小写行为已通过专门测试验证完全可扩展实现IStringTransformer/ICulturedStringTransformer即可与内置变换器混排使用无需改动全局配置。如需深入阅读可继续查看 To 类源码、变换器测试 以及 IStringTransformer API 文档。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Humanizer To 类使用 IStringTransformer 与 ICulturedStringTransformer 进行链式字符串大小写变换Humanizer To 类使用 IStringTransformer 与 ICulturedStringTransformer 进行链式字符串大小写变换 导开发工具Humanizer To 类完全指南用 IStringTransformer 管线化处理字符串大小写转换Humanizer To 类完全指南用 IStringTransformer 管线化处理字符串大小写转换 导读 Humanizer 是 .NET 生态中处理字开发工具Humanizer To 静态类指南在 .NET 中以链式 Transformer 统一处理字符串大小写转换Humanizer To 静态类指南在 .NET 中以链式 Transformer 统一处理字符串大小写转换 导读 To 是 Humanizer 中面向字符串开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表