Регулярные выражения в Kotlin с примерами: для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Регулярные выражения в Kotlin: полное руководство для начинающих

Регулярные выражения (regex) — это мощный инструмент для поиска, замены и проверки строк по шаблону. В Kotlin работа с регулярными выражениями реализована через класс Regex, который предоставляет удобные методы для обработки текста. В этой статье мы разберем основы регулярных выражений в Kotlin с наглядными примерами, которые помогут вам быстро освоить этот инструмент.

Что такое регулярное выражение?

Регулярное выражение — это последовательность символов, задающая шаблон для поиска в тексте. Например, шаблон \\d{3} находит три цифры подряд, а [A-Z]+ — одну или несколько заглавных букв.

В Kotlin для работы с regex используется класс Regex, который можно создать двумя способами:

// Способ 1: через конструктор
val regex1 = Regex("\\d+")

// Способ 2: через расширение toRegex()
val regex2 = "\\d+".toRegex()

Основные методы Regex в Kotlin

Класс Regex предоставляет несколько ключевых методов для работы со строками:

  • matches() — проверяет, соответствует ли вся строка шаблону
  • containsMatchIn() — проверяет, содержит ли строка хотя бы одно совпадение
  • find() — находит первое совпадение
  • findAll() — находит все совпадения
  • replace() — заменяет совпадения на указанную строку
  • split() — разделяет строку по шаблону

Пример 1: Проверка email-адреса

Начнем с практического примера — проверки корректности email-адреса:

fun isValidEmail(email: String): Boolean {
    val emailRegex = Regex("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")
    return emailRegex.matches(email)
}

fun main() {
    val emails = listOf(
        "user@example.com",
        "invalid-email",
        "test@domain.co.uk",
        "@gmail.com"
    )
    
    emails.forEach { email ->
        println("$email: ${if (isValidEmail(email)) "корректный" else "некорректный"}")
    }
}

Результат выполнения:

user@example.com: корректный
invalid-email: некорректный
test@domain.co.uk: корректный
@gmail.com: некорректный

Пример 2: Извлечение телефонных номеров

Допустим, у нас есть текст с разными телефонными номерами, и мы хотим извлечь все номера в формате +7 (XXX) XXX-XX-XX:

fun extractPhoneNumbers(text: String): List {
    val phoneRegex = Regex("""\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}""")
    return phoneRegex.findAll(text).map { it.value }.toList()
}

fun main() {
    val text = """
        Контакты:
        Менеджер: +7 (495) 123-45-67
        Поддержка: +7 (812) 987-65-43
        Дополнительный: 8-800-555-35-35
    """.trimIndent()
    
    val phones = extractPhoneNumbers(text)
    println("Найденные номера:")
    phones.forEach { println(it) }
}

Результат:

Найденные номера:
+7 (495) 123-45-67
+7 (812) 987-65-43

Обратите внимание: номер 8-800-555-35-35 не был найден, так как не соответствует нашему шаблону.

Пример 3: Замена и очистка текста

Регулярные выражения отлично подходят для замены частей текста. Например, удалим все HTML-теги из строки:

fun removeHtmlTags(html: String): String {
    val tagRegex = Regex("<[^>]*>")
    return tagRegex.replace(html, "")
}

fun main() {
    val htmlText = """
        <h1>Заголовок</h1>
        <p>Это <b>важный</b> текст.</p>
        <a href="link.html">Ссылка</a>
    """.trimIndent()
    
    val cleanText = removeHtmlTags(htmlText)
    println("Очищенный текст:")
    println(cleanText)
}

Результат:

Очищенный текст:
Заголовок
Это важный текст.
Ссылка

Пример 4: Разделение строки по сложному шаблону

Метод split() позволяет разделить строку не только по одному символу, но и по целому шаблону. Разделим строку по знакам препинания и пробелам:

fun splitByPunctuation(text: String): List {
    val splitRegex = Regex("[\\s,.!?;:]+")
    return text.split(splitRegex).filter { it.isNotEmpty() }
}

fun main() {
    val text = "Привет, мир! Как дела? Отлично; всё хорошо."
    val words = splitByPunctuation(text)
    println("Слова в тексте:")
    words.forEachIndexed { index, word ->
        println("${index + 1}. $word")
    }
}

Результат:

Слова в тексте:
1. Привет
2. мир
3. Как
4. дела
5. Отлично
6. всё
7. хорошо

Популярные шаблоны регулярных выражений

Вот несколько часто используемых шаблонов, которые пригодятся в работе:

ШаблонОписаниеПример
\\d+Одна или более цифр123, 4567
\\w+Одна или более букв, цифр или подчеркиванийhello, test_123
[A-Za-z]+Только латинские буквыHello, World
\\sЛюбой пробельный символпробел, табуляция
^...$Якоря начала и конца строкиточное совпадение
.Любой символ (кроме перевода строк

Блоги

Рекомендаций по книгам