Regex în Kotlin

Regex este o expresie regulată (un tipar de text); matches verifică tot textul, containsMatchIn caută o bucată.

Sintaxă
class Regex(pattern: String, option: RegexOption)
fun Regex.matches(input: CharSequence): Boolean
fun Regex.containsMatchIn(input: CharSequence): Boolean

Ce face Regex

O expresie regulată descrie un tipar de text: \d înseamnă o cifră, [a-z] o literă mică, + „o dată sau de mai multe ori”, {4} „exact de 4 ori”, ^ și $ începutul și sfârșitul. În Kotlin creezi tiparul cu Regex("..."). Ca să nu dublezi backslash-urile, scrie tiparul într-un raw string: Regex("""\d+""").

regex.matches(text) returnează true doar dacă tot textul respectă tiparul. regex.containsMatchIn(text) returnează true dacă tiparul apare undeva în text. Opțiunile, ca RegexOption.IGNORE_CASE, se dau ca al doilea argument.

Parametri

Parametru Descriere
pattern Tiparul, în sintaxa expresiilor regulate din Java.
option Opțional: de exemplu RegexOption.IGNORE_CASE.

Ce returnează

matches și containsMatchIn: Boolean.

Exemple

Exemplul 1: Validarea unui număr de telefon

Tiparul cere „07” urmat de exact 8 cifre. Al treilea număr are o cifră în plus, deci nu se potrivește complet.

fun main() {
    val telefon = Regex("""07\d{8}""")
    for (n in listOf("0722123456", "0232123456", "07221234567")) {
        println("$n: ${telefon.matches(n)}")
    }
}

Rezultat

0722123456: true
0232123456: false
07221234567: false

Exemplul 2: matches față de containsMatchIn

Textul conține un număr, dar nu este format doar din număr: containsMatchIn dă true, matches dă false.

fun main() {
    val numar = Regex("""\d+""")
    val text = "Camera 204"
    println(numar.matches(text))
    println(numar.containsMatchIn(text))
    println(numar.matches("204"))
}

Rezultat

false
true
true

Exemplul 3: Fără să conteze literele mari

Cu RegexOption.IGNORE_CASE, „IAȘI” și „iași” se potrivesc amândouă.

fun main() {
    val oras = Regex("iași", RegexOption.IGNORE_CASE)
    val mesaje = listOf("Plec la IAȘI mâine", "Sunt în Cluj", "iași e frumos")
    for (m in mesaje) {
        println("$m -> ${oras.containsMatchIn(m)}")
    }
}

Rezultat

Plec la IAȘI mâine -> true
Sunt în Cluj -> false
iași e frumos -> true

Greșeli frecvente

  • Scrii Regex("\d+") într-un String obișnuit. În ghilimele simple backslash-ul trebuie dublat ("\\d+"); mai simplu, folosește un raw string """\d+""".
  • Folosești matches când vrei să știi dacă tiparul apare undeva. matches verifică tot textul; folosește containsMatchIn sau find.

Comenzi înrudite

  • String.matches: text.matches(regex) verifică dacă tot textul respectă tiparul; toRegex transformă un String într-un Regex.
  • 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.
  • String.contains: Verifică dacă un text conține alt text, un caracter sau o potrivire Regex; se poate scrie și cu operatorul in.