Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Thêm gạch dưới trước mỗi chữ hoa trong chuỗi Java

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.