MatchResult.groupValues în Kotlin

groupValues dă textele prinse de parantezele din tipar; destructured le pune direct în variabile.

Sintaxă
val MatchResult.groupValues: List<String>
val MatchResult.destructured: MatchResult.Destructured
val MatchResult.groups: MatchGroupCollection

Ce face MatchResult.groupValues

Parantezele dintr-o expresie regulată formează grupuri: în (\w+)@(\w+) primul grup este utilizatorul, al doilea domeniul. groupValues este lista textelor prinse: la poziția 0 este toată potrivirea, la 1 primul grup, la 2 al doilea și așa mai departe.

destructured permite scrierea val (an, luna, zi) = potrivire.destructured, care pune grupurile 1, 2, 3 direct în variabile (fără grupul 0). Pentru grupuri cu nume, (?<an>\d{4}), folosește groups["an"]?.value.

Ce returnează

groupValues: List<String>. destructured: un obiect care se poate destructura.

Exemple

Exemplul 1: Lista grupurilor

Poziția 0 este toată potrivirea; 1 și 2 sunt grupurile din paranteze.

fun main() {
    val m = Regex("""(\w+)@(\w+)\.ro""").find("Scrie-mi la ana@exemplu.ro")
    if (m != null) {
        println(m.groupValues)
        println("Utilizator: ${m.groupValues[1]}, domeniu: ${m.groupValues[2]}")
    }
}

Rezultat

[ana@exemplu.ro, ana, exemplu]
Utilizator: ana, domeniu: exemplu

Exemplul 2: Destructurarea unei date

Cele trei grupuri ajung direct în trei variabile.

fun main() {
    val data = Regex("""(\d{2})\.(\d{2})\.(\d{4})""")
    val m = data.find("Examen pe 24.06.2025, sala 12") ?: return
    val (zi, luna, an) = m.destructured
    println("Ziua $zi, luna $luna, anul $an")
}

Rezultat

Ziua 24, luna 06, anul 2025

Exemplul 3: Prelucrarea unor rânduri de jurnal

Fiecare rând are ora, nivelul și mesajul. Rândurile care nu se potrivesc sunt sărite.

fun main() {
    val jurnal = listOf(
        "10:15 INFO Utilizator conectat",
        "10:17 EROARE Fișier lipsă",
        "rând invalid",
    )
    val tipar = Regex("""(\d{2}:\d{2}) (\w+) (.+)""")
    for (rand in jurnal) {
        val m = tipar.matchEntire(rand) ?: continue
        val (ora, nivel, mesaj) = m.destructured
        println("[$nivel] la $ora: $mesaj")
    }
}

Rezultat

[INFO] la 10:15: Utilizator conectat
[EROARE] la 10:17: Fișier lipsă

Greșeli frecvente

  • Iei groupValues[0] crezând că este primul grup. Indexul 0 este toată potrivirea; primul grup este la indexul 1.
  • Destructurezi mai multe variabile decât grupuri are tiparul. destructured are doar câte grupuri ai pus în paranteze.

Comenzi înrudite

  • Regex.find: find returnează prima potrivire a tiparului în text (sau null), findAll toate potrivirile; value este textul găsit.
  • Regex.replace: replace înlocuiește toate potrivirile tiparului (cu text fix sau calculat); split taie textul la fiecare potrivire.
  • Destructuring (val (a, b) = ...): Destructuring desface un obiect în mai multe variabile deodată: val (nume, nota) = pereche.