Как сделать slug из строки
Короткий ответ
Slug — часть адреса страницы из латинских букв, цифр и дефисов. Приведите строку к нижнему регистру и замените всё лишнее на дефис:
void main() {
String title = "Hello, World! Java 25 is here";
String slug = title.toLowerCase(Locale.ROOT)
.replaceAll("[^a-z0-9]+", "-")
.replaceAll("^-|-$", "");
IO.println(slug);
}Результат:
hello-world-java-25-is-hereБуквы с диакритикой
Normalizer раскладывает é на e и отдельный значок, который затем можно удалить:
import java.text.Normalizer;
String slugify(String text) {
String plain = Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll("\\p{M}", "");
return plain.toLowerCase(Locale.ROOT)
.replaceAll("[^a-z0-9]+", "-")
.replaceAll("^-|-$", "");
}
void main() {
IO.println(slugify("Crème Brûlée — à la carte"));
}Результат:
creme-brulee-a-la-carteПакет java.text тоже входит в java.base, но здесь показан явный import — так понятнее, откуда взялся класс.
Кириллица
Русские буквы не раскладываются на латинские — их нужно транслитерировать по таблице:
void main() {
var table = Map.of('п', "p", 'р', "r", 'и', "i", 'в', "v", 'е', "e", 'т', "t");
var result = new StringBuilder();
for (char c : "привет".toCharArray()) {
result.append(table.getOrDefault(c, String.valueOf(c)));
}
IO.println(result);
}Результат:
privetВ реальном проекте таблица содержит все 33 буквы.
Частая ошибка
Забыть убрать дефисы по краям. Строка, которая начинается или заканчивается знаком препинания, даст некрасивый адрес:
void main() {
IO.println("¡Hola!".toLowerCase().replaceAll("[^a-z0-9]+", "-"));
}Результат:
-hola-Функции из этого ответа
- String.replaceAll() — Заменяет все совпадения регулярного выражения.
- String.toLowerCase() — Возвращает копию строки, где все буквы строчные.
- String.strip() — Удаляет любые пробельные символы Unicode в начале и в конце строки.