java驼峰转下划线需分两步正则处理:先在小写+大写间插下划线,再在大写+大写小写间插下划线,最后统一小写;可兼容连续大写缩写、首尾大写等边界情况。

Java 中将驼峰命名(如 userName、XMLHttpRequest)转为下划线命名(如 user_name、xml_http_request)需兼顾大小写字母、连续大写(如缩写)、首尾下划线处理等细节。核心思路是:遍历字符,识别大写字母出现的位置,在合适位置插入下划线,并统一转小写。
基础规则与关键判断点
转换不是简单地在每个大写字母前加下划线,需区分以下情况:
- 小写字母后紧跟大写字母(如
userName→user_name),应在大写字母前加下划线 - 连续多个大写字母后接小写字母(如
XMLParser→xml_parser),最后一个大写字母前需加下划线 - 纯连续大写字母(如
HTTP→http),整体视为一个单词,不插下划线 - 开头或结尾的大写字母不额外添加前置/后置下划线(避免
_user_name或user_name_)
推荐实现方式:正则分段 + 字符处理
使用正则预分割再处理更清晰可靠。推荐用 replaceAll() 分两步处理:
public static String camelToUnderscore(String str) {
if (str == null || str.isEmpty()) return str;
// 第一步:在小写字母+大写字母之间插入下划线(如 userA → user_A)
String step1 = str.replaceAll("([a-z])([A-Z])", "$1_$2");
// 第二步:在大写字母+大写字母+小写字母之间插入下划线(如 XMLParser → XML_Parser → xml_parser)
String step2 = step1.replaceAll("([A-Z])([A-Z][a-z])", "$1_$2");
return step2.toLowerCase();
}
说明:
– 第一个正则 ([a-z])([A-Z]) 捕获“小写+大写”,替换成“小写_大写”;
– 第二个正则 ([A-Z])([A-Z][a-z]) 捕获“大写+(大写+小写)”,用于处理 HTTPParser 类场景;
– 最后统一转小写,自然合并连续大写段(如 XML → xml)。
边界情况验证示例
该算法能正确处理常见边界:
-
userName→user_name -
XMLHttpRequest→xml_http_request -
parseXML→parse_xml -
iPhone→iphone(注意:按常规驼峰规范,iPhone应写作iPhone,但实际中常视为i小写 +Phone大写,结果为i_phone;若需兼容 iOS 风格,可额外加规则) -
URL→url(全大写缩写直接小写)
进阶:支持自定义前缀/后缀或保留数字
若字符串含数字(如 user1Name),默认正则不会在数字和字母间加下划线。如需支持,可扩展第一步正则:
.replaceAll("([a-zA-Z\d])([A-Z])", "$1_$2")
再配合 toLowerCase() 即可得 user1_name。若需保留原始大小写(如仅加下划线不转小写),去掉最后的 toLowerCase() 即可,但通常下划线风格要求全小写。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











