Как перевести camelCase в snake_case и обратно
Короткий ответ
Вставьте подчёркивание перед каждой заглавной буквой, которой предшествует строчная или цифра, и приведите к нижнему регистру:
void main() {
String name = "userFirstName";
IO.println(name.replaceAll("([a-z0-9])([A-Z])", "$1_$2").toLowerCase());
}Результат:
user_first_nameАббревиатуры
Для имён вроде parseHTTPResponse добавьте второе правило — между аббревиатурой и следующим словом:
String toSnake(String name) {
return name.replaceAll("([A-Z]+)([A-Z][a-z])", "$1_$2")
.replaceAll("([a-z0-9])([A-Z])", "$1_$2")
.toLowerCase();
}
void main() {
IO.println(toSnake("parseHTTPResponse"));
IO.println(toSnake("orderId2Value"));
}Результат:
parse_http_response
order_id2_valueОбратно в camelCase
Разбейте по подчёркиванию и сделайте заглавной первую букву каждой части, кроме первой:
String toCamel(String name) {
String[] parts = name.split("_");
var result = new StringBuilder(parts[0]);
for (int i = 1; i < parts.length; i++) {
result.append(Character.toUpperCase(parts[i].charAt(0))).append(parts[i].substring(1));
}
return result.toString();
}
void main() {
IO.println(toCamel("user_first_name"));
}Результат:
userFirstNameЧастая ошибка
Вставлять подчёркивание перед каждой заглавной буквой без условия. Тогда имя с заглавной буквы начнётся с _, а аббревиатура распадётся на буквы:
void main() {
IO.println("UserID".replaceAll("([A-Z])", "_$1").toLowerCase());
}Результат:
_user_i_dФункции из этого ответа
- String.replaceAll() — Заменяет все совпадения регулярного выражения.
- String.toLowerCase() — Возвращает копию строки, где все буквы строчные.
- String.split() — Разбивает строку на массив частей по разделителю.