Назначение регулярных выражений

val splitExample = "Пример первый. " + 
  "Разделяем на слова, учитываем знаки препинания."
val regexp = Regex(" ")
val result = splitExample.split(regex)
val match = regex.findAll(splitExample).toList()
https://regex101.com/

Результат поиска по регулярному выражению

result.zip(match).forEach {
  print("${it.first}\n\t\t")
  it.second.groups.forEach { matchGroup ->
    print("range - ${matchGroup?.range}; ")
    println("value - |${matchGroup?.value}|")
  }
}
println(result.last())

Простейшее регулярное выражение

Regex(" ")
Пример      range - 6..6;   value - | |
первый.     range - 14..14; value - | |
Разделяем   range - 24..24; value - | |
на          range - 27..27; value - | |
слова,      range - 34..34; value - | |
учитываем   range - 44..44; value - | |
знаки       range - 50..50; value - | |
препинания.

Наборы символов

Regex("[,. ]")
Пример      range - 6..6;   value - | |
первый      range - 13..13; value - |.|
            range - 14..14; value - | |
Разделяем   range - 24..24; value - | |
на          range - 27..27; value - | |
слова       range - 33..33; value - |,|
            range - 34..34; value - | |
учитываем   range - 44..44; value - | |
знаки       range - 50..50; value - | |
препинания  range - 61..61; value - |.|

Квантификатор ?

Regex("[,.]? ")
Пример      range - 6..6;   value - | |
первый      range - 13..14; value - |. |
Разделяем   range - 24..24; value - | |
на          range - 27..27; value - | |
слова       range - 33..34; value - |, |
учитываем   range - 44..44; value - | |
знаки       range - 50..50; value - | |
препинания.

Перечисление

Regex("[[,.]? |.]")
Пример      range - 6..6;   value - | |
первый      range - 13..13; value - |.|
            range - 14..14; value - | |
Разделяем   range - 24..24; value - | |
на          range - 27..27; value - | |
слова       range - 33..33; value - |,|
            range - 34..34; value - | |
учитываем   range - 44..44; value - | |
знаки       range - 50..50; value - | |
препинания  range - 61..61; value - |.|

Ревнивая квантификация

Regex(" [[,|.]? |.]+")
Пример      range - 6..6;   value - | |
первый      range - 13..14; value - |. |
Разделяем   range - 24..24; value - | |
на          range - 27..27; value - | |
слова       range - 33..34; value - |, |
учитываем   range - 44..44; value - | |
знаки       range - 50..50; value - | |
препинания  range - 61..61; value - |.|

Квантификторы

В общем виде
Представление Число повторений Пример Соответствие
{n} Ровно n раз colou{3}r colouuur
{m,n} От m до n включительно colou{2,4}r colouur, colouuur, colouuuur
{m,} Не менее m colou{2,}r colouur, colouuur, colouuuur и т. д.
{,n} Не более n colou{,3}r color, colour, colouur, colouuur
Сокращения
Представление Число повторений Эквивалент Пример Соответствие
? Ноль или одно {0,1} colou?r color, colour
* Ноль или более {0,} colou*r color, colour, colouur и т. д.
+ Одно или более {1,} colou+r colour, colouur и т. д. (но не color)

Пример на замену

val replaceExample = "Федор Михайлович Достоевский " +
    "и Лев Николаевич Толстой. " + 
    "И Александр Сергеевич Пушкин, конечно."
val replaceRegex = Regex("([А-Я][а-я]+ ){2}[А-Я][а-я]+") 
println(replaceExample.replace(replaceRegex) {
    val fio = it.value.split(" ")
    "${fio[2]} ${fio[0][0]}. ${fio[1][0]}."
})

Пример на поиск

val findExample = "<div class='x'> text <b> bold </b> text </div>"
val regex = Regex("")
regex.findAll(findExample).forEach {
    print("---")
    it.groups.forEach { matchGroup ->
        print("\t range - ${matchGroup?.range}; ")
        println("value - |${matchGroup?.value}|")
    }
}

Метасимвол «.»

Regex("<.*>")
---	 range - 0..45; 
value - |
text bold text
|

Отрицание

Regex("<[^>]*>")
---	 range - 0..14;  value - |
| --- range - 21..23; value - || --- range - 30..33; value - || --- range - 40..45; value - |
|

Ленивая квантификация

Regex("<.*?>")
---	 range - 0..14; value - |
| --- range - 21..23; value - || --- range - 30..33; value - || --- range - 40..45; value - |
|

Группы

Regex("<(.*?)>.*")
---	 range - 21..33; value - | bold |
	 range - 22..22; value - |b|

Классы символов

Regex("<(.*?)>.*")
---	 range - 0..45; 
  value - |
text bold text
| range - 1..3; value - |div| range - 4..13; value - | class='x'| range - 15..39; value - | text bold text |