使用方法
- 把要转换的标识符粘进左框,每行一个(示例第 1 行是 HTTPServer)。
- 按 Ctrl+Enter(Mac 为 Cmd+Enter)或点「转 换」,右框按五种风格各输出一行。
- 多行输入时,同一风格行内以空格连接、顺序与输入一致,方便整列粘贴。
- 点「复制结果」把五种风格整块带走;点「载入示例」还原演示输入。
- 需要留档时用下方对照表的「导出对照表 CSV」(带 BOM,Excel 中文不乱码)。
驼峰大小写转换器能解决什么问题
同一份数据要在 MySQL 的 snake_case 列名、Java 的 camelCase 字段、C# 的 PascalCase 属性和前端请求里的 kebab-case 参数之间来回改名,手改大小写既慢又容易漏掉缩略词边界——HTTPServer 拆成 http_server 还是 h_t_t_p_server,每个团队吵过一次。驼峰大小写转换器用固定正则口径一次给出五种风格,十几行标识符整批转换,结果逐行可核对。
它只做风格互转,不做语义改名:想生成 URL 友好的中文标题转拼音 slug,用Slugify字符串工具;只想整体变大写小写,用字母转大写或字母转小写。
原理与规则说明
两遍边界正则。切分先用两条替换规则在词素之间插空格:/([a-z0-9])([A-Z])/g 处理「小写或数字紧接大写」的边界(response2JSON → response2 JSON),/([A-Z]+)([A-Z][a-z])/g 处理连续大写段的收尾(HTTPServer → HTTP Server)。最后按「非字母数字」切分得到词素数组。两条规则的顺序保证 HTTPServer 拆成 HTTP、Server 两段,而不是逐字母拆成 h_t_t_p_server。
边界口径的三处取舍。其一,数字并入前一词素:parse2JSON 得到 parse2、JSON,转出 parse2_json——数字被视为词的一部分,这与多数语言的标识符语法一致。其二,尾部缩略词同样拆开:mobileAPI 拆成 mobile、API 转出 mobile_api,与主流 snakeCase 实现口径一致;代价是 iOSApp 会拆成 i、OS、App 转出 i_os_app(见 FAQ)。其三,全大写词没有边界信息:HTTPSERVER 只能整体小写成 httpserver,正则没有可依据的落点。
五种输出映射。词素数组先统一转小写,再按目标风格重组:camelCase 首词素小写、其余首字母大写;PascalCase 全部首字母大写;snake_case 下划线连接(Python PEP 8 口径);kebab-case 连字符连接(URL 与 CSS 惯例);CONSTANT_CASE 下划线连接后全大写(环境变量与常量惯例)。同一份词素数组派生五种结果,保证互相之间逐词素一致。
完整示例(数值仅作演示)
默认五行输入 HTTPServer、response2JSON、user_profile_ID、mobileAPI、v2 的结果如结果区所示:snake_case 行是 http_server response2_json user_profile_id mobile_api v2,camelCase 行是 httpServer response2Json userProfileId mobileApi v2。这五行与下方对照表前 5 行逐字一致;点「载入示例」随时还原这组输入。
输入范围与对照表
输入按行处理,总长上限 5000 字符;每行应是英文字母、数字与分隔符(空格、下划线、连字符)的组合,中日韩字符会被整行拒绝。下表 16 行真实标识符全部由本页同一条算法实算,默认展示 12 行,点「加载更多」展开其余 4 行。
| 原始输入 | snake_case | camelCase | kebab-case | PascalCase | CONSTANT |
|---|---|---|---|---|---|
HTTPServer | http_server | httpServer | http-server | HttpServer | HTTP_SERVER |
response2JSON | response2_json | response2Json | response2-json | Response2Json | RESPONSE2_JSON |
user_profile_ID | user_profile_id | userProfileId | user-profile-id | UserProfileId | USER_PROFILE_ID |
mobileAPI | mobile_api | mobileApi | mobile-api | MobileApi | MOBILE_API |
parse2JSON | parse2_json | parse2Json | parse2-json | Parse2Json | PARSE2_JSON |
XMLHttp2Request | xml_http2_request | xmlHttp2Request | xml-http2-request | XmlHttp2Request | XML_HTTP2_REQUEST |
OAuth2Token | o_auth2_token | oAuth2Token | o-auth2-token | OAuth2Token | O_AUTH2_TOKEN |
myURLShortener | my_url_shortener | myUrlShortener | my-url-shortener | MyUrlShortener | MY_URL_SHORTENER |
iOSApp | i_os_app | iOsApp | i-os-app | IOsApp | I_OS_APP |
app_store_id | app_store_id | appStoreId | app-store-id | AppStoreId | APP_STORE_ID |
getHTTPResponseCode | get_http_response_code | getHttpResponseCode | get-http-response-code | GetHttpResponseCode | GET_HTTP_RESPONSE_CODE |
user2Name | user2_name | user2Name | user2-name | User2Name | USER2_NAME |
already-kebab | already_kebab | alreadyKebab | already-kebab | AlreadyKebab | ALREADY_KEBAB |
PascalCase | pascal_case | pascalCase | pascal-case | PascalCase | PASCAL_CASE |
Constant_CASE | constant_case | constantCase | constant-case | ConstantCase | CONSTANT_CASE |
x | x | x | x | X | X |
输入范围、边界与精度说明
输入规范化。输入先按 \r?\n 拆行、逐行 trim;总长超 5000 字符直接拒绝(避免一次性大文本卡住主线程);行内含中日韩字符时指出第几行并拒绝整次转换——大小写映射对这些文字无定义,强行输出只会得到原文。
输出边界。某行拆不出任何词素(纯符号或空行)会被跳过并在提示条报数;全部行都拆不出词素时报错而不是输出空串。单字符 x 的 PascalCase 是 X、其余风格保持 x,因为首字母大写只作用于首词素。词素重组时逐个 toLowerCase(),camelCase 非首词素用首字母大写 + 其余小写,所以 HTTP 这类全大写词素进入中位时会归一成 Http。
已知局限。iOSApp → i_os_app 不是缺陷而是口径:i 后接大写 O 符合边界规则,通用正则切分器(包括各语言的主流实现)同样如此;需要保形请把 iOS 手写成 ios 再转。全大写无分隔的词(HTTPSERVER)因缺少边界信号只能整体小写,本页不猜测切分点。
常见问题
HTTPServer 为什么拆成 http_server 而不是 h_t_t_p_server?
因为第二条边界正则 /([A-Z]+)([A-Z][a-z])/ 把连续大写段作为整体保留,只在「大写段 + 大写后跟小写」的收尾处切一刀,HTTP 保持完整。逐字母拆分是单字符边界的错误实现。
iOSApp 转出来是 i_os_app,是 bug 吗?
是口径而不是 bug:i 是小写、O 是大写,符合「小写接大写」的边界规则。主流通用转换器同此表现;在意保形就把 iOS 写成 ios 再转,得到 ios_app。
mobileAPI 为什么拆出 api?
本页对尾部缩略词同样按边界拆分(mobile、API → mobile_api),与主流 snakeCase 实现一致。这样 camelCase 的 mobileApi 再转回 snake 时口径闭合,不会出现两种结果。
全大写 HTTPSERVER 为什么只能得到 httpserver?
全大写没有大小写变化的落点,正则找不到边界信号。约定俗成的补救是先手工按下划线或驼峰写好再转,本页不做无依据的猜测切分。
parse2JSON 里的数字怎么处理?
数字并入前一词素:parse2 作为一个词素,转出 parse2_json。若你希望数字独立成段(parse_2_json),本页不提供该口径,请手工调整。
五种风格分别用在哪类代码里?
snake_case 用于 Python(PEP 8)与数据库列名,camelCase 用于 Java/JavaScript 变量(Google 风格指南),PascalCase 用于 C# 类名,kebab-case 用于 URL 路径与 CSS 类名,CONSTANT_CASE 用于环境变量与编译期常量。
为什么中文整行被拒绝而不是跳过?
中日韩文字没有大小写概念,转换后等于原样输出,容易让人误以为已经处理过。指出行号拒绝,是把问题留在转换前而不是污染结果。
输入的内容会上传吗?
不会。转换只调用字符串与正则方法,不发任何网络请求,可在开发者工具 Network 面板核对;刷新后输入清空。