命名风格转换(camelCase · snake_case · kebab-case 等 7 种写法)
把变量名或一整列名字转成 camelCase、PascalCase、snake_case、CONSTANT_CASE、kebab-case、Title Case、sentence case 七种写法,并显示拆出来的词;转换在浏览器本地完成。
| 风格 | 结果 |
|---|---|
| camelCase | |
| PascalCase | |
| snake_case | |
| CONSTANT_CASE | |
| kebab-case | |
| Title Case | |
| sentence case | |
四组转换好的对照
| 打进去 | 识别出的词 | camelCase | Title Case |
|---|---|---|---|
XMLHttpRequest | xml · http · request | xmlHttpRequest | Xml Http Request |
get_user_id | get · user · id | getUserId | Get User Id |
some-kebab-name.with.dots | some · kebab · name · with · dots | someKebabNameWithDots | Some Kebab Name With Dots |
iPhone 5S Case | i · phone · 5 · s · case | iPhone5SCase | I Phone 5 S Case |
分词口径与七种写法
同一个名字的几种写法
代码里同一个名字常常要在几种写法之间来回搬:接口文档给的是 user_name,前端 state 要 userName,环境变量要 USER_NAME,埋点字段又要 user-name。手工改大小写是那种"看一眼就会做错"的活——XMLHttpRequest 里 H 到底归上一个词还是下一个词,脑子里没有确定答案,只能猜。
所以这里一次给全 7 种写法,并且把拆出来的词显示在「识别出的词」那一格里:结果对不对,先看那行的词,不用逐个字符去数。勾上「按行拆分」就能一整列粘进来,一次拿到 7 种写法 × N 个名字。
分词口径
输出质量完全取决于这一步,规则就四条:
- 分隔符:任何既不是字母也不是数字的字符都切开——空格、
-、_、.、/、\、:、括号、逗号,以及中文全角标点。some-kebab-name.with.dots→ some · kebab · name · with · dots;名称:abc→ 名称 · abc。 - 大小写边界:小写或数字后面出现大写,大写另起一词。
getUserId→ get · user · id,http2Server→ http2 · server。 - 连续大写算一个缩写:一串大写字母合成一个词;但如果这一串的最后一个大写后面紧跟小写,它就划给下一个词。
XMLHttpRequest→ xml · http · request,parseHTTPResponse→ parse · http · response,HTTPSConnection→ https · connection。整串没有小写跟着时就是一整个词,URL→ url、MD5→ md5。 - 数字跟着前面的词走:数字串并进它前面那个词,
md5hash→ md5 · hash,sha256sum→ sha256 · sum;如果输入开头就是数字、前面没有字母,那它连同紧跟的字母算一个词,2faLogin→ 2fa · login,2024report是一整个词。
拆完之后所有词先统一转小写再按风格拼接,「识别出的词」那一格显示的就是这批已经小写化的词,和下面的 snake / CONSTANT 输出逐字对得上:camelCase / snake_case / kebab-case 全小写,PascalCase / Title Case 每个词首字母大写,CONSTANT_CASE 全大写。因为重拼的底座是小写,缩写不会保持全大写——XMLHttpRequest 的 camelCase 是 xmlHttpRequest,不会是 XMLHTTPRequest。
非英文名字会怎样:中文、日文、带重音的字母都算"字母",可以参与组词,但只有真的有小写形态的字母才会触发大小写拆分。所以 caféLatte → café · latte(重音完整保留,CONSTANT 得到 CAFÉ_LATTE),而 用户名abc 是一个词——中文没有大小写,工具拿不到任何边界。emoji、™ 这类符号按分隔符处理。输入上限 4000 个字符,超出的部分不参与转换,提示里会写明。
字符类别优先用 Unicode 属性判断(\p{L} 那一套),万一内核不支持就退回 charCodeAt 范围判断,此时凡是 0x80 以上都当作字母,全角标点、emoji 可能被粘进词里。2018 年以后的浏览器都走 Unicode 分支,正常用不到兜底。
一行一个名字
勾选「按行拆分输入」后,每一行独立分词、独立出结果,7 格里每格都是"一行一个结果",可以直接整列复制。空行会被忽略,纯标点的行(比如 !!!)拆不出词,会被跳过并在提示里列出输入里的行号。因为这两种行都不占输出位置,输出第 N 行未必等于输入第 N 行——所以「识别出的词」那一格是按 第 5 行:url · parser 这样带行号写的,靠它对位最稳。
不勾选时,整个输入(换行也算分隔符)当成一个名字处理:粘 get_user_id 和 Some-Other NAME 两行进去,得到的是拼在一起的 getUserIdSomeOtherName。这个模式适合把一句 the user id column 变成变量名。
一次贴几百行时,每格都会拉长成几百行,浏览器仍然算得动(上限 4000 字符约合三百多个短名字),但要复制的话建议一批几十行地来。
什么时候结果不能直接用
- 项目要求缩写全大写:
getURLPath这里给的是getUrlPath。ESLint 的camelcase规则、或者内部命名规范要求getURL,就得自己改后面那段。 - 数字和版本号的取舍:
v2rayClient被拆成 v2 · ray · client(camel 得v2RayClient),VERSION_1_2的 camelCase 是version12——数字段之间的分隔符在驼峰里必然消失。看到这两类就核对一遍。 - 人名、品牌、专有名词:
iPhoneCases→ i · phone · cases,MacDonald→ macDonald。姓名里的Mac到底该不该分开是人的约定,机器不知道。 - Title Case 不等于标题规范:这里只把每个词首字母大写,不会把
a、of、the、to这类虚词降回去,也不处理连字符标题。要发稿的标题还得人工过一遍。 - 大小写映射的语言陷阱:通用映射其实比想象中规矩(德语
ß大写成SS、ẞ小写回ß都对),真正会翻车的是土耳其语的İ:小写化得到i加一个组合符(两个码点),结果里会多出一个"带点的 i";反过来小写i大写化也不会变成İ。语言相关的映射规则(土耳其语、阿塞拜疆语的 i/İ)这里一概不认识,多语言专有名词请人工确认。 - 中文等非拉丁文字:转换只是加了分隔符,
用户名abc拼出来的还是中文,绝大多数语言的标识符规范不接受,别以为转成功就能用。
常见问题
Q:为什么不直接给 XMLHTTPRequest 这种全大写缩写?
因为口径是"先拆词、再全部小写重拼",只有 PascalCase 和 Title Case 会把每个词的首字母大写。这个选择的好处是结果可预测、不会出现"哪些缩写该大写"这种各家规范不同的争论;代价就是上面那条:需要全大写缩写时请手工补。
Q:一次能处理多少? 4000 个字符以内。超了只用前 4000,末尾那一行可能被切成半截,提示里会明说。每次按键都会重算,量级到这个程度完全感觉不到延迟。
Q:粘进来的字段名会上传吗?
分词和拼接就是脚本里的一个循环,没有 eval;你输入的名字不进请求体,不会离开这台设备。
Q:为什么 !!! 只出提示、不出结果?
纯标点拆不出任何词,这时候打印 7 行空串会让人以为"转换成功但结果为空"。所以直接把输出清空并写「没有可拆分的词,请检查输入」,多行模式下这类行会连行号一起报出来。