Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как сделать 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 в начале и в конце строки.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.