Перейти к содержанию

KTB-14 Распарсить строку, используя регулярные выражения (RegEx)

📝 Описание

Регулярные выражения (RegEx) позволяют осуществлять сложный поиск и замену в строках. Они особенно полезны для парсинга данных из текстовых строк, таких как ответы от API.


Дополнительные материалы:

🗒 Задание

  1. Прочитать и распарсить отправляемое в бот сообщение. Вывести в консоль.
  2. Переписать парсинг update_id с использованием Regex.

❌ Ошибки

✏️ Комментарии

Regex лучше записать в переменную за пределами while. Мы стараемся не пересоздавать переменные лишний раз.

val updateIdRegex = "\"update_id\":(.+?),".toRegex()
while (true) {
    // ...
    updateId = updateIdRegex.find(updates)?.groups?.get(1)?.value
    // ...
}

⌨️ Решение

// KTB-14 (из видео)-1
val messageTextRegex: Regex = "\"text\":\"(.+?)\"".toRegex()

// KTB-14 (из задания)
val updateIdRegex = "\"update_id\":(\\d+)".toRegex()

while (true) {
    Thread.sleep(2000)

    val updates = getUpdates(botToken, updateId)
    println(updates)

    /* KTB-14 (сократили)
    val startUpdateId = updates.lastIndexOf("update_id")
    val endUpdateId = updates.lastIndexOf(",\n\"message\"")

    if (startUpdateId == -1 || endUpdateId == -1) continue
    println(updates.substring(startUpdateId, endUpdateId))

    val updateIdString = updates.substring(startUpdateId + 11, endUpdateId)
    updateId = updateIdString.toInt() + 1
    */

    // KTB-14 (замена парсинга updateId на RegEx)
    updateId = updateIdRegex.find(updates)?.groups?.get(1)?.value?.toIntOrNull()?.plus(1) ?: continue

    // KTB-14 (из видео)-2
    val matchResult: MatchResult? = messageTextRegex.find(updates)
    val groups = matchResult?.groups
    val text = groups?.get(1)?.value
    println(text)
}