วิธีที่ 1: ใช้ StringBuffer + Character.isUpperCase()
วนลูปตรวจสอบแต่ละตัวอักษร หากเป็นพิมพ์ใหญ่ ใส่ underscore ก่อน
ตัวอย่าง
public class AddUnderscoreBeforeCapital {
public static void main(String[] args) {
String str = "HelloHowAreYouWelcome";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isUpperCase(ch)) {
sb.append('_');
}
sb.append(ch);
}
String result = sb.toString();
System.out.println(result); // _Hello_How_Are_You_Welcome
}
}
ผลลัพธ์
_Hello_How_Are_You_Welcome
วิธีที่ 2: ใช้ Regular Expression replaceAll() (กระชับกว่า)
Regex ([A-Z]) capture group ตัวพิมพ์ใหญ่ แทนที่ด้วย _$1 (underscore + captured group)
ตัวอย่าง
public class AddUnderscoreBeforeCapitalRegex {
public static void main(String[] args) {
String str = "HelloHowAreYouWelcome";
String result = str.replaceAll("([A-Z])", "_$1");
System.out.println(result); // _Hello_How_Are_You_Welcome
}
}
ผลลัพธ์
_Hello_How_Are_You_Welcome
ปัญหา: ตัวอักษรแรกจะมี underscore นำหน้า
ทั้งสองวิธีจะเพิ่ม underscore หน้าตัวแรกเสมอ หากไม่ต้องการ:
แก้ด้วย StringBuffer
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isUpperCase(ch) && i > 0) { // เพิ่มเงื่อนไข i > 0
sb.append('_');
}
sb.append(ch);
}
แก้ด้วย Regex (lookahead)
// (?
กรณีพิเศษ: ตัวเลขและสัญลักษณ์
String str = "HelloWorld123Test";
str.replaceAll("(?
การประยุกต์: CamelCase to snake_case
public static String camelToSnake(String camelCase) {
return camelCase
.replaceAll("(?
สรุป
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| StringBuffer + Loop | เข้าใจง่าย ควบคุม logic ได้ละเอียด | โค้ดยาวกว่า |
| Regex replaceAll | กระชับ 1 บรรทัด | Regex อาจยากต่อการ maintain |