命名风格互转
camel / Pascal / snake / kebab / CONSTANT 五种风格一键互转
命名风格转换:五种写法的区别与转换中的陷阱
五种风格
| 风格 | 示例 | 常见用在哪 |
|---|---|---|
| camelCase | userLoginCount | JavaScript / Java 的变量与方法名 |
| PascalCase | UserLoginCount | C# / Java / TypeScript 的类型名 |
| snake_case | user_login_count | Python / Ruby 的标识符、数据库列名 |
| kebab-case | user-login-count | URL、CSS 类名、HTML 属性、文件名 |
| CONSTANT_CASE | USER_LOGIN_COUNT | 常量的约定写法 |
工具的转换过程是先把输入拆成词,再按目标风格拼回去。所以理解转换行为的关键是"拆词的规则",而不是拼接。
拆词规则与它的边界
要正确拆分,必须先识别出词边界。工具采用三条规则:
| 规则 | 例子 | 结果 |
|---|---|---|
| 小写或数字后接大写 → 在此断开 | userLogin | user / login |
| 连续大写后接"大写+小写" → 在最后一个大写前断开 | HTTPResponse | http / response |
| 非字母数字字符视作分隔符 | user-login_count | user / login / count |
第二条规则专门用来处理缩写词。如果没有它,HTTPResponse 会被拆成 h / t / t / p / response,这显然是错的。只按"大写字母前断开"的简单实现会毁掉所有含缩写的名字,这是最常见的转换 bug。
但即使有这条规则,仍有无解的情况:
userID会被拆成 user / id(正确),但userIDs可能拆成 user / i / ds(因为IDs是"大写+大写+小写")。这类缩写词加复数的写法无法靠规则完美解决。- 单个词的全大写无法判断是缩写还是普通词。
ID、URL转成 camelCase 会得到id、url(约定如此),但OK变成ok、IO变成io是否合适就见仁见智了。 - 已经无分隔符的小写串无法拆分。
userlogin只能整体当作一个词,工具不会(也不应该)猜出中间有边界。
所以转换不是双向可逆的:userID → USER_ID → userId,往返之后就与原始写法不同了。想保真,就要在转换前确认原始写法,并检查结果。
转换时的实际陷阱
- 缩写词的大小写无法从其他风格还原。
http_response和HTTP_response转成 PascalCase 都是HttpResponse,丢了"HTTP 是缩写"这个信息。需要HTTPResponse时只能手工改。 - 数字的位置。
utf8Encode、base64Encode:数字与字母的边界如何影响拆分,不同工具处理不同,可能导致utf_8_encode与utf8_encode两种结果。转换后要核对。 - kebab-case 不能做标识符。它在有些语言里是减号表达式,在 JSON 键里也需要引号。它适合 URL 和 CSS,不适合变量名。
- 数据库列名与代码字段往往风格不同。一个常见需求是把
user_login_count(数据库)转成userLoginCount(代码中的字段)。批量处理时注意不要把已经是 camelCase 的再转一次,重复转换不会变化(幂等),但把 kebab 转 snake 时连字符会被吞掉,需要确认没有多余分隔符。 - 大小写敏感的语言。Go 里首字母大写意味着导出(public),小写意味着私有。转成 PascalCase 会改变可见性,这可能是你想要的,也可能是编译错误的来源。
工具怎么用
输入任意一种风格的标识符,工具会一次给出全部五种风格的结果,直接复制需要的那一行即可。输入里的空格、连字符、下划线、点号等分隔符都会被识别为词边界。
适合重命名变量时确定目标写法、把后端返回的 snake_case 字段转成前端用的 camelCase、以及为 CSS 类名生成对应的 JS 标识符。转换在浏览器本地完成。
常见问题
怎么拆分词?
先按下划线、连字符、空格等分隔符切分,再处理驼峰边界(如 getUserInfo 拆成 user / get / info),统一转小写后重组。
支持中文标识符吗?
不支持。命名风格转换面向 ASCII 字母数字标识符;中文会作为非单词字符被忽略。