ARTICLE DETAIL

资讯详情

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

Humanizer 字符串变形扩展 InflectorExtensions 完全指南:Pascalize、Pluralize 与命名风格转换实战

Humanizer 字符串变形扩展 InflectorExtensions 完全指南:Pascalize、Pluralize 与命名风格转换实战 开发工具【免费下载链接】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 是 .NET 生态中用于处理字符串、枚举、日期、数字与数量展示的知名工具库。InflectorExtensions是其中负责单词变形Inflection与标识符命名风格转换的核心静态扩展类覆盖了复数化/单数化Pluralize/Singularize、PascalCase/camelCase 转换、下划线、连字符与标题化等 9 大类高频场景。读完本文你将掌握每个扩展方法的签名、参数语义、底层实现原理与测试佐证能够直接在业务代码中完成数据库列名、类名、URL 路由、CSS 类名与 UI 文案的规范化处理。一、InflectorExtensions 是什么InflectorExtensions是一个public static class其全部成员都是this string的扩展方法因此可以像some_title.Pascalize()这样直接链式调用。类文件头部注释表明其实现最早克隆自开源项目 Inflector原作者 Scott KirklandMIT 许可并在 Humanizer 仓库内持续演进例如加入了复合速率词per 结构的处理与不区分文化的 ASCII 快速路径。从源码结构看src/Humanizer/InflectorExtensions.cs该类的实现分为两个层次纯字符级转换Pascalize、Camelize、Underscore、Dasherize、Hyphenate、Kebaberize、Titleize主要基于正则表达式与 ASCII 快速路径词汇表驱动转换Pluralize与Singularize真正的工作委托给 Vocabularies.cs 中内置的Vocabulary.Default词汇表。类内预置了三条关键正则模式源码第 28–31 行private const string PascalizePattern (?:[ _.-]|^)(.)?; private const string UnderscorePattern1 ([\p{Lu}])([\p{Lu}][\p{Ll}]); private const string UnderscorePattern2 ([\p{Ll}\d])([\p{Lu}]); private const string UnderscorePattern3 [-\s];其中UnderscorePattern1负责拆分“大写连续串 首大写后小写”如HTMLParserUnderscorePattern2负责拆分“小写或数字 大写”如SomeTitleUnderscorePattern3负责将连字符与空白转换为分隔符。这些模式在 .NET 7 下使用[GeneratedRegex]编译在旧目标框架下则退化为RegexOptions.Compiled静态字段兼顾性能与兼容性。二、命名风格转换Pascalize / Camelize / Underscore / Kebaberize这一组方法解决的是“任意分隔符文本 ↔ .NET 标识符风格”的互转问题是自动化生成类名、列名、URL slug 时最常用的工具。Pascalize转换为 UpperCamelCase默认行为是“去除下划线并将字符串转换为 UpperCamelCase”即每个单词首字母大写、移除所有分隔符文档示例与测试tests/Humanizer.Tests/InflectorTests.cs均给出如下结果输入输出customer_nameCustomerNamecustomer_first_name goes hereCustomerFirstNameGoesHerecustomer-first-nameCustomerFirstNamesome.text.hereSomeTextHerecustomer name $CustomerName$实现上InflectorExtensions.cs优先走TryPascalizeAscii快速路径仅当输入全部为 ASCII 时生效避免为纯 ASCII 输入付出正则开销否则回退到PascalizeRegex逐个匹配(?:[ _.-]|^)(.)?并把捕获组首字符转大写。注意该快速路径只处理 、_、-、.四种分隔符且转大写使用CultureInfo.InvariantCulture因此大小写转换不受当前线程文化影响——测试专门用tr-TR与az-Latn-AZ文化验证了这一点InflectorTests.cs避免土耳其 i 问题导致行为漂移。当前仓库实现额外提供了带preserveUppercase参数的重载传true时保留连续大写串SMS parameter provider.Pascalize(preserveUppercase: true)→SMSParameterProvider传false时按词边界拆分并规范化HTTP IO module.Pascalize(preserveUppercase: false)→HttpIoModule。Camelize与 Pascalize 相同但首字符小写Camelize的语义与Pascalize完全一致唯一的区别是第一个字符转为小写。文档给出了some_property_name.Camelize() somePropertyName源码实现InflectorExtensions.cs比文档描述更精细保留前导下划线_some_property_name.Camelize() _somePropertyName、__customer_name.Camelize() __customerName前导下划线会被原样保留测试见 InflectorTests.cs其余部分先做Pascalize再把第一个字符用小写不区分文化地转换。当前仓库还提供ToCamelCase()变体注意命名差异它在 camelize 之前先做Underscore从而把连续大写序列当作独立单词规范化例如IOModule.ToCamelCase() ioModule、__XMLHttpRequest.ToCamelCase() __xmlHttpRequest。Underscore转为小写下划线分隔Underscore将 PascalCase、camelCase、空格、连字符统一转换为lower_case_with_underscores典型用例是生成数据库列名与文件命名。文档与测试InflectorTests.cs给出的行为输入输出SomeTitlesome_titlesomeTitlesome_titlesome titlesome_titleHTMLParserNamehtml_parser_nameSomeForeignWordsLikeÄgyptenÑusome_foreign_words_like_ägypten_ñu实现InflectorExtensions.cs用UnderscoreRegex1→UnderscoreRegex2依次插入下划线分隔大小写边界再用UnderscoreRegex3把-和空白替换为_最后按参数决定是否ToLowerInvariant()。另有Underscore(preserveCase: true)重载保留原大小写HTMLParserName.Underscore(preserveCase: true) HTML_Parser_NameInflectorTests.cs此时测试数据SomeForeignWordsLikeÄgyptenÑu会输出Some_Foreign_Words_Like_Ägypten_Ñu可见它对非 ASCII 字符同样有效。Kebaberize转为全小写连字符分隔Kebaberize是Underscore与Dasherize的组合先把输入转成下划线小写形式再把所有下划线换成连字符最终得到kebab-case常用于 CSS 类名、HTML 属性和 URL slug。文档示例SomePropertyName.Kebaberize() some-property-name测试InflectorTests.cs还覆盖了混合大小写、外来字符A spanish word EL niño→a-spanish-word-el-niño等场景。源码中InflectorExtensions.cs同样先尝试 ASCII 快速路径失败时执行Underscore(input).Dasherize()。三、纯替换转换Dasherize / Hyphenate这两个方法是三类中最“轻量”的只做字符替换不做大小写与分词处理Dasherize(underscoredWord)将字符串中的所有_替换为-文档原话 “Replaces underscores with dashes in the string”。实现即underscoredWord.Replace(_, -)InflectorExtensions.cs典型用法是Underscore之后把snake_case转成dash-casesome_property_name.Dasherize() some-property-nameHyphenate(underscoredWord)同样是“用连字符替换下划线”源码显示它是Dasherize的别名Dasherize(underscoredWord)仅为 API 语义清晰而存在两个方法的行为完全一致InflectorTests.cs 用完全相同的测试数据验证。四、词形变化Pluralize 与 Singularize这两个方法处理英语单复数变化是 InflectorExtensions 中唯一需要词汇表Vocabulary支撑的能力。Pluralize单数转复数public static string? Pluralize(this string? word, bool inputIsKnownToBeSingular true);参数语义来自文档与源码 XML 注释word要被复数化的单词允许为 nullnull 时返回 null[return: NotNullIfNotNull]注解保证inputIsKnownToBeSingular默认true表示你确定输入是单数当你不确定输入可能已经是复数时传false方法会做双重校验避免“重复复数化”例如cats.Pluralize(inputIsKnownToBeSingular: false)仍返回cats。实现上Vocabularies.cs内置词汇表注册了约 20 条复数规则与大量不规则词覆盖常规加 s$ → s、s$ → sus → i(octop|vir|alumn|fung|cact|...)us$ → $1icactus→cactio → oes(buffal|tomat|volcan|...)o$ → $1oespotato→potatoesf/fe → ves(cal|dwar|...)f$ → $1ves、(kni|li|wi)fe$ → $1veswolf→wolves、knife→knives辅音y → ies([^aeiouy]|qu)y$ → $1iescity→citiesx/ch/ss/sh → es(x|ch|ss|sh)$ → $1esbox→boxes不规则词Vocabularies.csperson → people、man → men、child → children、foot → feet、tooth → teeth、goose → geese、mouse → mice等不可数名词Vocabularies.csstaff、information、software、fish、sheep、deer、series、metadata等原样返回。一个值得注意的细节是Vocabulary.Pluralize会先处理以 per 分隔的复合速率词CompoundHeadLength逻辑见 Vocabulary.cs只复数化分子、保留分母例如meter per second.Pluralize() meters per second并兼容空格/制表符/Unicode 空格变体测试覆盖joule PER\tmole per kelvin与\u00A0、\u2009等空白符。大小写也被保留FOOT PER SECOND.Pluralize() FEET PER SECOND、PERSON.Pluralize() PEOPLEMatchUpperCase逻辑Vocabulary.cs。Singularize复数转单数public static string Singularize(this string word, bool inputIsKnownToBePlural true, bool skipSimpleWords false);参数语义word要单数化的单词inputIsKnownToBePlural默认true表示你确定输入是复数不确定时传false以避免把本来就是单数的词错误变形person.Singularize(inputIsKnownToBePlural: false) personskipSimpleWords默认false传true时跳过那些只是末尾带 s 的简单单词避免ross被错误地单数化为ros这类误伤Singularize(skipSimpleWords: true)时方法会跳过第一条通用规则s$ → 。内置单数规则Vocabularies.cs与复数规则互为逆运算例如([dti])a$ → $1umdata→datum、(x|ch|ss|sh)es$ → $1、(li|wi|kni)ves$ → $1fe、(octop|vir|...)i$ → $1us。不规则与不可数词汇表与复数共用同一份。如何自定义词形规则Vocabularies.DefaultVocabularies.cs暴露了AddPlural、AddSingular、AddIrregular、AddUncountable、AddAcronym等扩展点Vocabulary.cs例如处理bus → buses这类特例Vocabularies.Default.AddIrregular(bus, buses); // 或精确规则 Vocabularies.Default.AddPlural((bus)$, $1es);其中AddIrregular的matchEnding参数控制是否把规则应用于更长单词的结尾默认true即person规则也会影响salesperson的变形matchEnding: false则只整词匹配。需要提醒的是当前词汇表不支持创建多个独立词库或删除已注册规则源码注释明确 “multiple vocabularies and removing existing rules are not supported”所有自定义规则全局生效。五、Titleize先 Humanize 再标题化Titleize(input)的文档描述是 “Humanizes the input with Title casing”——它不是简单的逐词首字母大写而是先调用Humanize()拆分 PascalCase、下划线、连字符等边界再用LetterCasing.Title应用标题大小写。典型结果some_title.Titleize() Some TitlesomeTitle.Titleize() Some Titlesome-package_name.Titleize() Some Package Name实现InflectorExtensions.cs有一个防退化分支当 Humanize 结果为空输入中没有可识别的字母时原样返回输入。这对应 Issue #385 的修复测试用Майк、、?、123验证InflectorTests.cs避免非字母输入被 Title 化后丢失。六、补充ToPossessive 与完整的实战组合链当前仓库的InflectorExtensions还包含文档未列出的ToPossessive扩展InflectorExtensions.cs用于生成英语所有格单数名词cat.ToPossessive() cats、James.ToPossessive() Jamess复数名词inputIsPlural: truedogs.ToPossessive(inputIsPlural: true) dogs、children.ToPossessive(inputIsPlural: true) childrens仅用撇号风格useApostropheOnlyForSingularWordsEndingInS: trueJames.ToPossessive(useApostropheOnlyForSingularWordsEndingInS: true) Jamesnull / 空白输入原样返回测试 InflectorTests.cs。最后把各方法串成一条典型的“规范化流水线”以直观对比它们的分工var table customer_first_name; // snake_case table.Pascalize(); // CustomerFirstName 类名/类型名 table.Pascalize().Camelize(); // customerFirstName 变量/参数名 table.Underscore(); // customer_first_name 列名/文件名 table.Kebaberize(); // customer-first-name URL slug/CSS 类 some_title.Dasherize(); // some-title 纯下划线替换 orders.Singularize(); // order 词形还原 customer.Pluralize(); // customers 词形复数化 customer_orders.Humanize().Titleize(); // Customer Orders UI 标题文案七、适用边界与总结InflectorExtensions的转换以英语词汇表和字符级规则为基础Pluralize/Singularize的词汇表面向US English源码注释明确非英语场景不建议依赖词形变化而Pascalize/Underscore/Kebaberize等字符级转换不区分文化culture-invariant对带重音的外来字符如élan、Ägypten、Ñu也能正确处理只是这类输入会绕过 ASCII 快速路径、走正则分支。一句话总结各方法的选型需要词形变化用Pluralize/Singularize需要标识符风格互转用Pascalize/Camelize/Underscore/Kebaberize需要纯字符替换用Dasherize/Hyphenate需要展示文案用Titleize。它们的全部行为都有 InflectorTests.cs 中 600 余行测试覆盖可直接作为你接入 Humanizer 时的行为参照。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐如何调教 cjbind 输出枚举风格、别名风格与 CString 字符串转换实战指南如何调教 cjbind 输出枚举风格、别名风格与 CString 字符串转换实战指南 cjbind 是一个自动生成仓颉语言Cangjie到 C 库 FF代码生成开发工具ZITADEL QR Code 转 SVG 实现解析用 CSS Class 替代内联样式让 TOTP 验证码兼顾主题化与 CSP 合规ZITADEL QR Code 转 SVG 实现解析用 CSS Class 替代内联样式让 TOTP 验证码兼顾主题化与 CSP 合规 本篇以 intern开发工具Beekeeper Studio 切换中文界面3 种方式一次配好Beekeeper Studio 切换中文界面3 种方式一次配好 新同事第一天打开 Beekeeper Studio报错信息看不懂、菜单找不到配个连接都卡桌面应用数据库客户端开发工具上一篇yaitoo/xun构建优化生产环境下的资源哈希与缓存策略下一篇QuantLib终极性能优化指南10个自适应网格和并行计算技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表