Регулярные выражения в 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 | Любой пробельный символ | пробел, табуляция |
^...$ | Якоря начала и конца строки | точное совпадение |
. | Любой символ (кроме перевода строк
БлогиРекомендаций по книгамЧитайте также |