Snake大小写转换工具

把驼峰、空格、连字符、斜杠与标点混写的命名,统一切成下划线风格。缩写块先按连续大写边界切开,再把重复的分隔符合并、首尾去掉,最后整体小写;数字要不要跟前一个词连写由开关决定。

共 4 行 / 转换 4 段 / 最长结果 16 字符
hello_world parse_xml_string user_profile_id a_b_c

默认示例四行:Hello World、parseXMLString、user_profile_id、A*B(C),结果依次为 hello_world、parse_xml_string、user_profile_id、a_b_c。

使用方法

  1. 文本框里默认放着 4 行示例:Hello World、parseXMLString、user_profile_id、A*B(C)。打开页面就能看到转换结果,把这段内容替换成你自己的命名即可。
  2. 转换按行独立进行。一行一个标识符或一句话,每行各自分段后拼成 snake_case,行与行之间不会互相粘连;空行转换后仍是空行。
  3. 「数字与前一个词连写」默认不勾选。不勾选时数字单独成段,parse XML 2 doc 得到 parse_xml_2_doc;勾选后数字贴到前一个词上,得到 parse_xml2_doc。
  4. 在文本框里按 Ctrl 加回车开始转换(Mac 上用 Cmd 加回车),回车留给换行;也可以直接点「转换」按钮。改勾选状态会自动重算一次。
  5. 结果区下方是「逐行明细」表,列出每一行的原文、默认结果与数字连写结果,以及该行被切成几段。
  6. 「复制结果」复制整段转换后的文本;「下载 .txt」存成纯文本文件;「导出 CSV」把明细表存成带字节序标记的表格;「复制对照表」复制正文那张 12 行对照表。
  7. 输入为空、没有字母数字、转换后是空串,三种情况各有具体提示。
  8. 要别的命名风格就换工具:连字符风格走短横线大小写转换器,首字母大写连写走驼峰大小写转换器。

这个Snake大小写转换工具能解决什么问题

同一份数据在不同系统里往往叫不同的名字。前端传来 userName,Python 侧的常量写 USER_NAME,数据库字段是 user_name,SQL 别名又写成 UserName。映射时逐个手改,改到第十个字段基本就会漏掉一个。

本页做的事是把「一段任意写法的文本」切成词,再用下划线把词接起来。切词的依据只有三条:小写或数字后面紧跟大写是一个边界;连续大写块后面接上一个大写加小写的普通词,边界落在大写块的末尾;除此之外的任何非字母数字字符都算作分隔。三条定下来,输入写法不影响结果。

它对代码改名尤其有用。把一整列旧的命名粘进来,一次性转成下划线风格,再粘回配置文件或数据字典,比逐条替换可靠;「数字连写」开关让你按目标代码库的既有风格批量统一。

它和站内其他大小写工具是并列关系而不是替代关系。短横线大小写转换器输出连字符,驼峰大小写转换器输出首字母大写连写,句子大小写转换器只处理首字母与句读,交替大小写转换器是大小写交错,英文标题大小写转换器按标题规则保留虚词小写。本页只输出下划线。

另一个用处是校验。已有的 snake_case 文本粘进来应当原样返回;如果转出来变了样,说明原命名里混进了大写、连续下划线或首尾分隔符。

这个工具在本站也叫Snake大小写转换器。名字里的「Snake」来自下划线像蛇趴在地面上的说法。

计算原理与变量说明

转换是固定的四步流水线,顺序不能调换。前三步只负责「在哪里切一刀」,最后一步负责收拾分隔符并统一大小写。

第一步,大小写边界插分隔符。规则是 ([a-z0-9])([A-Z]) 换成 $1_$2。小写字母或数字后面直接跟大写字母,就是一个新词的开头:helloWorld 切成 hello_World,aBc1D 里的 a 与 B 之间、1 与 D 之间各切一刀。

第二步,缩写块后接普通词。规则是 ([A-Z]+)([A-Z][a-z]) 换成 $1_$2。连续大写是一个缩写块,块里最后一个大写字母若带着后面的小写字母,它属于下一个词:HTTPResponse 先切成 HTTP_Response,HelloWorldXMLParser 先切成 Hello_World_XML_Parser。

第三步,非字母数字统一换成下划线。规则是 [^A-Za-z0-9]+ 换成 _。空格、连字符、斜杠、括号、星号、制表符,以及中文之类的非 ASCII 字符,全部走这一步;加号表示连续的一串算一个分隔符,不会切出空段。

第四步,合并、去首尾、整体小写。先把连续的下划线并成一个,再去掉开头与结尾的下划线,最后转成小写:foo__bar 得到 foo_bar,--leading and trailing-- 得到 leading_and_trailing,GET/user/info 得到 get_user_info。

第二步是 snake_case 转换最容易错的地方。只有第一步时,HTTPResponse 里没有小写字母在前的位置,一刀都切不开,整体小写后变成 httpresponse。补上第二步,连续大写块 HTTP 被单独认出来,后面接的 Response 才分成一个词。

「数字算独立词还是连写」没有统一标准。PEP8 倾向把数字当独立段写成 x_2_doc,而大量工程代码库习惯写成 xml2doc。本页把它做成开关而不是替你决定:默认按独立段处理。

非 ASCII 字符统一转成下划线而不是丢弃。中文、全角标点、制表符都走第三步变成分隔符,这样你能看见「原本这里有一个分隔」。静默丢字符会让左右两段粘成一个词,而这种错误在几百行的列表里极难发现。

snake_case 与 kebab-case 只差一个分隔符字符。前三步的分段逻辑完全相同,把第三步的输出由下划线改成连字符就能得到连字符风格。正因为只有这一步不同,两种风格才各占一页。

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

示例文本共 4 行,依次是 Hello World、parseXMLString、user_profile_id、A*B(C)。默认参数(数字不连写)下结果依次为 hello_world、parse_xml_string、user_profile_id、a_b_c,逐行对应,行数不变。

第一行 Hello World:第一步没有「小写接大写」的位置,第二步没有连续大写块,第三步把空格换成下划线得到 Hello_World,第四步整体小写得到 hello_world。这一行没有数字,勾选连写与否结果相同。

第二行 parseXMLString:第一步在 e 与 X 之间切一刀得到 parse_XMLString;第二步把连续大写块 XML 与后面的 String 分开,得到 parse_XML_String;第四步整体小写得到 parse_xml_string。

第三行 user_profile_id:本身就是标准下划线命名,前三步都不改变它(下划线在第三步被换成下划线),第四步小写后原样返回。这类「转了等于没转」的行正好用来确认原命名是否规范。

第四行 A*B(C):第三步把星号、左括号、右括号各换成下划线,得到 A_B_C_,第四步去掉末尾下划线再小写,得到 a_b_c。首尾分隔符就是这样被清掉的。

把示例第二行换成 parse XML 2 doc 就能看出开关的作用:不勾选时数字单独成段,得到 parse_xml_2_doc;勾选后 l 与 2 之间的下划线被去掉,得到 parse_xml2_doc。iPhone 15 Pro 同理,默认 i_phone_15_pro,勾选后 i_phone15_pro。

命名风格对照表

下表列出 12 组典型输入在两种开关状态下的结果。默认列是「数字与前一个词连写」不勾选,连写列是勾选。前三行没有数字,两列应当一致;第 6 行与第 9 行含数字,两列不同。

输入文本默认结果数字连写结果
Hello Worldhello_worldhello_world
helloWorldhello_worldhello_world
HTTPResponsehttp_responsehttp_response
HelloWorldXMLParserhello_world_xml_parserhello_world_xml_parser
user-name iduser_name_iduser_name_id
parse XML 2 docparse_xml_2_docparse_xml2_doc
foo__barfoo_barfoo_bar
--leading and trailing--leading_and_trailingleading_and_trailing
iPhone 15 Proi_phone_15_proi_phone15_pro
GET/user/infoget_user_infoget_user_info
Aaa
aBc1Da_bc1_da_bc1_d

第 3 行与第 4 行是缩写块的两种形态。HTTPResponse 里缩写块在开头,HelloWorldXMLParser 里缩写块夹在中间,两步流水线都能处理;第 10 行 GET/user/info 的缩写块后面跟的是斜杠而不是普通词,第二步不生效,靠第三步切开。

第 6 行与第 9 行是开关唯一会改变结果的地方。第 6 行的数字前面是字母 l,第 9 行的数字前面是字母 e,两处都符合 ([A-Za-z])_([0-9]) 这一模式,所以勾选后都少一条下划线;其余十行没有「字母下划线数字」的组合,开关不影响。

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

常见问题

HTTPResponse 为什么变成 http_response 而不是 httpresponse?

因为流水线里专门有一步处理缩写块:连续大写块后面接上「大写加小写」的普通词时,边界落在大写块的末尾,HTTPResponse 先被切成 HTTP_Response,再整体小写得到 http_response。只靠「小写接大写」这一条规则切不开它。

数字到底要不要跟前一个词连写?

两种写法都能在新老项目里见到,PEP8 倾向把数字当独立段写成 x_2_doc,而很多工程代码库写 xml2doc。本页把它做成开关:默认不勾选,数字单独成段;勾选后按「字母 + 下划线 + 数字」的模式把数字贴回前一个词。

输入里有中文或全角标点,为什么结果里多出下划线?

因为非字母数字字符统一走第三步变成分隔符,而不是被删掉,这样你能看到「原本这里有一个分隔」。静默丢字符会让左右两段粘成一整个词,在几百行的列表里几乎不可能靠肉眼发现。

它和短横线大小写转换器有什么区别?

前三步的分段逻辑完全一样,区别只在第三步输出的分隔符字符:本页输出下划线,那一页输出连字符。因为只有这一步不同,两种风格才各占一页——共用一套切词逻辑,但输出口径与适用场景并不互通。

一行里本来就有连续下划线或首尾符号,会怎样?

连续下划线会在第四步被合并成一个,开头与结尾的下划线会被去掉。所以 foo__bar 得到 foo_bar,--leading and trailing-- 得到 leading_and_trailing。

想确认已有的下划线命名是否规范,怎么用?

直接粘进来转换一次。规范的 snake_case 会原样返回;如果转出来变了样,说明原命名里混进了大写字母、连续下划线或首尾分隔符。

这个工具免费吗?

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

输入的数据安全吗?

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

相关工具