Regex.find în Kotlin

find returnează prima potrivire a tiparului în text (sau null), findAll toate potrivirile; value este textul găsit.

Sintaxă
fun Regex.find(input: CharSequence, startIndex: Int = 0): MatchResult?
fun Regex.findAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult>
val MatchResult.value: String
val MatchResult.range: IntRange

Ce face Regex.find

regex.find(text) caută prima bucată din text care respectă tiparul și returnează un MatchResult, sau null dacă nu găsește nimic. Din rezultat iei textul găsit cu value și poziția cu range.

regex.findAll(text) returnează o Sequence cu toate potrivirile, în ordine. O parcurgi cu for sau o transformi cu map { it.value } și toList(). Potrivirile nu se suprapun.

Parametri

Parametru Descriere
input Textul în care se caută.
startIndex De unde începe căutarea (implicit 0).

Ce returnează

find: MatchResult?. findAll: Sequence<MatchResult>.

Exemple

Exemplul 1: Primul număr dintr-un text

find găsește „250”, primul grup de cifre. range arată pozițiile ocupate în text.

fun main() {
    val text = "Comanda costă 250 lei și ajunge în 3 zile"
    val potrivire = Regex("""\d+""").find(text)
    if (potrivire != null) {
        println(potrivire.value)
        println(potrivire.range)
    }
    println(Regex("""\d+""").find("fără cifre"))
}

Rezultat

250
14..16
null

Exemplul 2: Toate numerele cu findAll

Luăm toate sumele din text, le transformăm în numere și le adunăm.

fun main() {
    val text = "pâine 5 lei, lapte 7 lei, brânză 19 lei"
    val sume = Regex("""\d+""").findAll(text).map { it.value.toInt() }.toList()
    println(sume)
    println("Total: ${sume.sum()} lei")
}

Rezultat

[5, 7, 19]
Total: 31 lei

Exemplul 3: Hashtag-uri dintr-o postare

Tiparul #[\p{L}\d_]+ găsește un # urmat de litere (din orice limbă, inclusiv ă, ș, ț), cifre sau _.

fun main() {
    val postare = "Vacanță la mare #Constanța2025 #vara #litoral"
    for (m in Regex("""#[\p{L}\d_]+""").findAll(postare)) {
        println("${m.value} la pozițiile ${m.range}")
    }
}

Rezultat

#Constanța2025 la pozițiile 16..29
#vara la pozițiile 31..35
#litoral la pozițiile 37..44

Greșeli frecvente

  • Folosești find(text)!!.value. Dacă tiparul nu apare, programul se oprește; verifică null sau folosește ?.value.
  • Apelezi findAll(...).size. Rezultatul este o Sequence, nu o listă; folosește count() sau toList().
  • \w din Java nu include implicit literele cu diacritice: în „#Brașov” se găsește doar „#Bra”. Folosește [\p{L}\d_]+ pentru litere din orice limbă.

Comenzi înrudite

  • MatchResult.groupValues: groupValues dă textele prinse de parantezele din tipar; destructured le pune direct în variabile.
  • Regex: Regex este o expresie regulată (un tipar de text); matches verifică tot textul, containsMatchIn caută o bucată.
  • Regex.replace: replace înlocuiește toate potrivirile tiparului (cu text fix sau calculat); split taie textul la fiecare potrivire.
  • sequence: Construiește o secvență dintr-un bloc de cod care dă valori una câte una cu yield; codul se oprește și continuă la cerere.