Chuyển camelCase hoặc PascalCase thành snake_case (thêm _ trước chữ hoa).
Cách 1: StringBuilder + Character.isUpperCase()
public static String addUnderscoreBeforeUpper(String str) {
if (str == null || str.isEmpty()) return str;
StringBuilder sb = new StringBuilder();
for (char ch : str.toCharArray()) {
if (Character.isUpperCase(ch)) {
sb.append('_');
}
sb.append(ch);
}
return sb.toString();
}
Cách 2: Regex replaceAll – Ngắn gọn
// Thêm _ trước mỗi chữ hoa
String result = str.replaceAll("([A-Z])", "_$1");
// Kết quả: "_Hello_World" → có thể dẫn đầu _
// Khắc phục: không thêm _ nếu là ký tự đầu
String result2 = str.replaceAll("(?!^)([A-Z])", "_$1");
// (?!^) = negative lookahead: không khớp nếu ở đầu chuỗi
Ví dụ so sánh
public class UnderscoreBeforeUpper {
public static void main(String[] args) {
String input = "HelloWorldJava";
System.out.println("Cách 1 (loop): " + addUnderscoreBeforeUpper(input));
System.out.println("Cách 2 (regex all): " + input.replaceAll("([A-Z])", "_$1"));
System.out.println("Cách 3 (regex no-leading): " + input.replaceAll("(?!^)([A-Z])", "_$1"));
}
static String addUnderscoreBeforeUpper(String str) {
StringBuilder sb = new StringBuilder();
for (char ch : str.toCharArray()) {
if (Character.isUpperCase(ch)) sb.append('_');
sb.append(ch);
}
return sb.toString();
}
}
Kết quả
Cách 1 (loop): _Hello_World_Java
Cách 2 (regex all): _Hello_World_Java
Cách 3 (regex no-leading): Hello_World_Java
Mở rộng: Chuyển sang snake_case hoàn chỉnh
public static String toSnakeCase(String str) {
return str.replaceAll("(?!^)([A-Z])", "_$1").toLowerCase();
}
// "HelloWorld" → "hello_world"
// "XMLParser" → "x_m_l_parser" (có thể muốn "xml_parser" → cần logic phức tạp hơn)
Khuyến nghị: Cách 3 (regex negative lookahead) ngắn gọn, đúng chuẩn snake_case không dẫn đầu gạch dưới.