Pascal 命名转换

把 hello_world、user-id、HTTPResponse 等任意写法的标识符转成首字母大写的 PascalCase(大驼峰):先按空格、下划线、连字符、点号切分,再按连续大写与数字边界二次拆分后拼接,支持一次粘贴多行,全部在浏览器本地完成。

—

本页的核心结论:PascalCase 与 camelCase 的唯一区别是首字母——同一组词 user profile image,Pascal 写成 UserProfileImage,camel 写成 userProfileImage;连续大写缩写一律按「大写 + 小写」切开,所以 HTTPResponse 得到 HttpResponse,而含小写的 OAuth2TokenRefresh 反而原样不变。

使用方法

  1. 在「待转换内容」里粘贴或输入文本,每行一个标识符。页面打开时已经填好三行示例(hello_world、HTTPResponse、2fa setup),可以直接改。
  2. 如果需要,再填「额外分隔符」:有些代码库用 + 或 | 连接单词,把它们填进这一格,就会被当成空格一样的分隔符处理;留空表示只认空格、下划线、连字符与点号。
  3. 点「转换为 PascalCase」,或在「额外分隔符」输入框里直接按 Enter 键。多行文本请用 Ctrl(macOS 为 Cmd)+ Enter 触发,单独按 Enter 仍然是换行。
  4. 结果区逐行给出转换后的标识符,行数与输入一一对应;空白行会原样保留为空行。
  5. 「转换结果」文本框只读,点「复制结果」可整段复制;下方对照表列出 28 组输入与输出的对应关系,点「复制对照表」得到制表符分隔的文本,点「导出 CSV」得到带 UTF-8 BOM 的表格文件。
  6. 表格默认先显示 12 行,点「加载更多」补齐其余,便于逐条核对边界情况。

这个 Pascal 命名转换能解决什么问题

同一个概念在不同语言与不同团队里会写成不同样子:Python 与数据库习惯 user_profile_image,CSS 习惯 user-profile-image,Java 与 C# 的类名要求 UserProfileImage,JavaScript 的变量常用 userProfileImage。手工逐字改大小写既慢又容易漏——尤其是 HTTPResponse 这类连续大写缩写,人手下意识会写成 HTTPResponse 而语言规范要求 HttpResponse。这个 Pascal 命名转换把「拆词」与「拼词」两件事分开做:先无条件把输入拆成词序列,再按 Pascal 规则重新拼接,所以无论输入是哪种写法,输出都只有一种形式。

先把名称对齐:站内沿用的写法是「Pascal命名转换」,规范术语就叫 PascalCase,中文也称大驼峰命名或首字母大写拼接。

它适合把数据库字段名批量转成实体类属性名、把 kebab-case 的 CSS 类名转成 React 组件名、把用户填写的英文标题转成合法标识符,也适合在写接口文档时统一字段命名。页面不修改你的原始输入,只输出转换结果,所以可以先对照一遍再决定要不要采用。需要说明的是,国内 UI 文案里的中文按钮、标题不应该套用 Pascal 命名——中文没有大小写,硬套只会得到一串没有可读性收益的字母串。

计算原理与变量说明

转换规则分四步,顺序固定:

最容易产生歧义的是连续大写的切法。HTTPResponse 理论上至少有三种合理切分:H + TTPResponse、HTTP + Response、HTTPR + esponse。本页采用业界通行的「大写 + 小写」切法,即把最后一个大写字母划给后面的词,得到 HTTP + Response,输出 HttpResponse;这正好匹配 .NET 与 Java 官方命名指南对缩写词的要求(连续缩写词按普通单词处理,只保留首字母大写)。如果换成「逐字母切」的规则,HTTP 会被拆成四个单词,输出变成 HtTpResponse,显然不可用。

第二个机制是含小写的缩写不会被拆。OAuth2TokenRefresh 里的 OAuth 是「大写 O + 小写 Auth」,规则 ([A-Z]+)([A-Z][a-z]) 要求前半段至少一个大写、后半段是「大写 + 小写」,它在这里找不到匹配点,于是 OAuth 作为一个整体进入第三步,转小写得 oauth、首字母大写回到 OAuth,最终 OAuth2TokenRefresh 原样输出——这不是没生效,而是规则对这类混合大小写缩写的正确行为。

第三个机制是数字边界的处理。字母与数字之间一定会被拆开,所以 user2name 会先拆成 user、2、name 三段,再拼成 User2Name;但纯数字 123 不会被拆,转小写后首字符仍是数字,「首字母大写」对数字没有作用,输出依旧是 123。

完整示例(数值仅作演示)

示例条件:默认输入为三行文本 hello_world、HTTPResponse、2fa setup,额外分隔符留空。逐行转换后得到 HelloWorld、HttpResponse、2FaSetup;其中第三行以数字开头,页面会把它标成不合法标识符。下表列出全部 24 组示例,字符数一列表示「输入长度 → 输出长度」。

输入PascalCase 输出字符数说明
hello worldHelloWorld11 → 10空格分隔
hello_worldHelloWorld11 → 10下划线分隔
hello-worldHelloWorld11 → 10连字符分隔
helloWorldHelloWorld10 → 10camelCase 小写开头,在大写边界处拆开
HelloWorldHelloWorld10 → 10已经是 PascalCase
HELLO_WORLDHelloWorld11 → 10全大写 + 下划线,先整体转小写再首字母大写
hello.worldHelloWorld11 → 10点号分隔,常见于包名与配置键
userIDUserId6 → 6尾部连续大写缩写被拆开
HTTPResponseHttpResponse12 → 12连续大写按「大写 + 小写」切
JSON_to_XMLJsonToXml11 → 9大写缩写与下划线混用
" multiple spaces "MultipleSpaces21 → 14引号仅为示意,连续空格与首尾空格全部折叠
v2_api_clientV2ApiClient13 → 11字母与数字边界处拆开
getUserByIDGetUserById11 → 11动词短语,两处缩写被归一化
OAuth2TokenRefreshOAuth2TokenRefresh18 → 18含小写的缩写 OAuth 不被拆分
IDId2 → 2两位缩写
URLUrl3 → 3三位缩写
aA1 → 1单字母小写
AA1 → 1单字母大写
1231233 → 3纯数字,首字母大写对数字无效
user2nameUser2Name9 → 9数字两侧各拆一刀
my-var_2MyVar28 → 6混合分隔符
(空)(空)0 → 0空输入返回空串
" "(空)3 → 0纯分隔符,拆完没有词
alreadyPascalCaseAlreadyPascalCase17 → 17已是小写开头驼峰,首字母补大写

示例中的输入内容均为演示取值,用来覆盖各种分隔符与边界写法,不代表任何具体项目的命名规范。

六种命名风格对照表

同一组词 user profile image 在六种常见命名风格下的写法如下。本页输出的是第一行 PascalCase;如果需要其它风格,可以先用本页转换成 PascalCase,再把词边界补回对应分隔符。

命名风格结果单词边界与大小写
PascalCaseUserProfileImage无分隔符,每个词首字母大写
camelCaseuserProfileImage无分隔符,首词小写、其后首字母大写
snake_caseuser_profile_image下划线连接,全部小写
SCREAMING_SNAKEUSER_PROFILE_IMAGE下划线连接,全部大写
kebab-caseuser-profile-image连字符连接,全部小写
dot.caseuser.profile.image点号连接,全部小写

下表把十二种输入写法统一转换成 PascalCase,用于核对「不同写法是否收敛到同一结果」。

输入PascalCase校验
user profile imageUserProfileImage✓
user_profile_imageUserProfileImage✓
user-profile-imageUserProfileImage✓
userProfileImageUserProfileImage✓
USER_PROFILE_IMAGEUserProfileImage✓
user.profile.imageUserProfileImage✓
User Profile ImageUserProfileImage✓
userProfileIMAGEUserProfileImage✓
xmlHTTPRequestXmlHttpRequest✓
getURLFromIDGetUrlFromId✓
Customer2AddressCustomer2Address✓
_private_var_PrivateVar✓

结果边界、舍入与适用说明

常见问题

Pascal 命名和驼峰命名(camelCase)到底有什么区别?

区别只在首字母:PascalCase 每个词都首字母大写,包括第一个词,所以写成 UserProfileImage;camelCase 的第一个词保持小写,写成 userProfileImage。两者拆词与拼接规则完全相同,所以本页先转 Pascal 再补一步「首字母改小写」就能得到 camelCase。C#、Java 用 Pascal 命名类型与方法,JavaScript、Java 用 camel 命名变量与方法。

为什么 HTTPResponse 会变成 HttpResponse?

因为连续大写缩写在第二步被按「大写 + 小写」切开,拆成 HTTP 与 Response 两个词,第三步再把每个词整体转小写、首字母大写,HTTP 就收敛成了 Http。这样处理符合 .NET 与 Java 的命名指南:缩写词按普通单词对待,只保留首字母大写,所以 ID 得到 Id、URL 得到 Url。

OAuth2TokenRefresh 为什么原样不变?

因为 OAuth 是「大写 O + 小写 Auth」的混合写法,拆分规则要求大写段之后紧跟「大写 + 小写」,OAuth 里找不到这样的切点,于是它整体进入归一化:转小写得 oauth,首字母大写又回到 OAuth。同理 Token、Refresh 也都得到相同结果,所以整串原样输出。这说明规则没有失效,只是这类缩写本就不该被拆。

2fa setup 转出来是 2FaSetup,能直接当变量名用吗?

不能。Pascal 命名要求首字符是字母,数字开头的标识符在 C#、Java、Go 里都不是合法名称,页面会在结果区给出提示。建议在前面补一个语义前缀,例如 TwoFaSetup、TotpSetup 或 Verify2FaSetup,把数字挪到中间或末尾。

中文和带重音的字母会怎么处理?

原样保留、只做大小写归一化。中文没有大小写,所以「用户 名称」得到「用户名称」;é 这类重音字母不会被转成 e,因为它们在不少语言里是不同字符,强行去音标可能改变标识符含义。唯一例外是字母与数字的边界仍会被拆开,例如「版本2」不会触发拆分,因为汉字不在字母数字集合里。

点号被当成分隔符,会不会误伤小数点?

会有影响,需要注意。本页把点号视为词边界,所以 1.5 会被拆成 1 与 5,再拼成 15。如果你的输入包含小数、版本号(如 1.2.3)或 IP 地址,请先把这些片段单独处理,或先用「额外分隔符」之外的方式避开——因为额外分隔符只能增加分隔符,无法取消点号这一默认分隔符。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具