直接用正则在大写字母前插下划线会错误拆分连续大写缩写(如geturl→get_u_r_l)、产生前置或多余下划线(如username→_user_name),且无法识别数字后大写(user2id)等边界;正确方案需分步正则:先处理“小写+大写”边界,再补“小写+大写”和“大写+小写”组合,最后统一转小写并清理冗余下划线。

camelCase → snake_case 为什么不能直接用正则插下划线?
因为 camelCase 的边界不只有大写字母,还有数字、开头/结尾、连续大写(如 XMLParser)等特殊情况。单纯查找 [A-Z] 并替换为 _l$1 会把 UserName 变成 _user_name(多一个前置下划线),或把 getURL 变成 get_u_r_l(错误拆分缩写)。真正可用的规则必须分步、带上下文判断。
正确两步走:先插下划线,再统一小写
核心是用两个正则组合,避免全局误伤:
- 第一步:查找
(.)([A-Z][a-z]),替换为$1_$2—— 在「小写字母后接大写字母」的位置插入下划线(如userName→user_Name) - 第二步:查找
([a-z])([A-Z]),替换为$1_$2—— 补上「小写+大写」边界(如user_Name→user_Name已完成,但getURL需这步处理getU→get_U) - 执行完两步后,全选文本,用
Edit → Convert Case → lower case或快捷键Ctrl+K松手后按L - 最后手动清理多余下划线:查找
__替换为_,再查^_+|_+$(开头或结尾多个下划线)替换为空
连续大写字母(如 XML、ID、URL)怎么保缩写?
这是最容易出错的地方。比如 getURL 应转成 get_url,而不是 get_u_r_l。必须加前置条件:
- 查找
([A-Z]+)([A-Z][a-z]),替换为$1_$2—— 识别「多个大写 + 一个大写开头的单词」,如XMLParser→XML_Parser - 再查
([a-z])([A-Z]),替换为$1_$2—— 处理剩余边界,此时getURL中的getU变成get_U,后续小写就自然得get_url - 如果原始串含
userID,会变成user_id;user2ID则变成user2_id,符合常规命名习惯
正则里大小写控制符 \U 和 \E 容易漏掉 \E
想在替换中直接转小写?别用 \L$0——它没配 \E 就会把整行后续所有内容都变小写。实际应写 \L$0\E。但更推荐分步:先正则插下划线,再统一用 lower case 命令,可控性高、不易翻车。
另外,\b 在 Sublime 里把下划线和数字也当单词字符,所以 \bName\b 会匹配到 userName 里的 Name,慎用。











