Регулярное выражение для парсинга текста с HTML

Может кто подсказать регулярное выражение для Kotlin, чтобы из этого текста получить два блока (выделил красным на скрине)?

  1. Первый блок текста: от <h1>Первый заголовок:</h1> и до <h1>Второй заголовок:</h1>
  2. Второй блок текста: от <h1>Второй заголовок:</h1> и до конца

p.s У заголовков как могут быть теги, так и нет

<h1>Первый заголовок:</h1> <ul> <li>Первый буллит</li> <li>Второй буллит</li> <li>Третий буллит</li> <li><a href='https://www.test.com/'>Ссылка на сайт</a></li> </ul> <h1>Второй заголовок:</h1> <b>Первый подзаголовок:</b> <ul> <li>Первый буллит</li> <li>Второй буллит</li> <li>Третий буллит</li> </ul> <b>Второй подзаголовок:</b> <ul> <li>Первый буллит</li> <li>Второй буллит</li> <li>Третий буллит</li> <li><a href='https://www.test.com/'>Ссылка на сайт</a></li></ul>

Исходный текст


Ответы (1 шт):

Автор решения: Danila Kartovitskii

Можешь попробовать следующий патерн:

val pattern = "(<h1>[^<]*</h1>)(.*?)(<h1>[^<]*</h1>)(.*?)\\z"
val regex = Regex(pattern, RegexOption.DOT_MATCHES_ALL)
val matchResult = regex.find(text)

if (matchResult != null) {
    val firstBlock = (matchResult.groupValues[1] + matchResult.groupValues[2]).trim()
    val secondBlock = (matchResult.groupValues[3] + matchResult.groupValues[4]).trim()
} else {
    // Не найдено
}
→ Ссылка