使用正则表达式可将驼峰命名转为下划线命名:先匹配“小写字母或数字后紧跟大写字母”的位置(如(?

Java中将驼峰命名(如 userName)转为下划线命名(如 user_name),用正则表达式是最简洁的方式,核心在于识别大小写字母交界处并插入下划线。
匹配大写字母前的位置并插入下划线
关键思路是:在小写字母或数字后面、紧接着大写字母的位置插入下划线。使用 (? 这个零宽断言组合:
(? 表示“前面是一个小写字母或数字”(<code>\p{Ll}是 Unicode 小写字母)-
(?=\p{Lu})表示“后面是一个大写字母”(\p{Lu}是 Unicode 大写字母) - 两者合起来,精准定位
userA中r和A之间的空隙
统一转小写 + 替换
替换后需把整个字符串转为小写,否则会得到 user_Name 而非 user_name:
- 先用
replaceAll("(? 插入下划线 - 再调用
toLowerCase() - 完整写法:
str.replaceAll("(?
处理连续大写字母的边界情况
对类似 XMLParser 或 IOStream 这类缩写连写,单纯上面规则会变成 x_m_l_parser,不符合预期。可增强正则,区分“大写+小写”和“大写+大写+小写”:
立即学习“Java免费学习笔记(深入)”;
- 优先匹配
(?(小写→大写) - 再匹配
(?(大写→大写+小写,如 <code>XMLParser中M和P之间) - 合并写法:
str.replaceAll("(?
实际使用示例
推荐封装成工具方法,兼顾可读与健壮性:
public static String camelToUnderscore(String str) {
if (str == null || str.isEmpty()) return str;
return str.replaceAll(
"(?<=\p{Ll}|\d)(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}\p{Ll})",
"_"
).toLowerCase();
}
测试效果:
camelToUnderscore("userName") → "user_name"<br>
camelToUnderscore("XMLHttpRequest") → "xml_http_request"<br>
camelToUnderscore("iOSVersion") → "ios_version"


















