Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Regex no Kotlin

Bom dia a todos

Eu vi essa aula do Java e resolvi transpor o conteúdo para o Kotlin, copie os métodos e adaptei para essa linguagem e deu certo:

import org.junit.jupiter.api.Test
import java.util.regex.Pattern
import kotlin.test.assertEquals

class RegexKotlin {
    private val pattern = Pattern.compile("(\\d\\d)(\\w)")
    private val matcher = pattern.matcher("11b22g33t")
    @Test
    fun encontraOPrimeiroPadrao(){
        if (matcher.find()){
            assertEquals("11b",matcher.group())
            assertEquals("11",matcher.group(1))
            assertEquals("b",matcher.group(2))
        }
    }
    @Test
    fun quantidadeDeMatch(){
        if (matcher.find()){
            assertEquals(0,matcher.start())
            assertEquals(3,matcher.end())
        }
    }
    @Test
    fun encontraTodosOsPadroes(){
        val listaDeStrings = mutableListOf<String>()
        while (matcher.find()){
            val format = String.format("%s-%s-%s-[%d,%d]", matcher.group(), matcher.group(1),
                matcher.group(2), matcher.start(), matcher.end())
            listaDeStrings.add(format)
        }
        assertEquals("[11b-11-b-[0,3], 22g-22-g-[3,6], 33t-33-t-[6,9]]",listaDeStrings.toString())
    }
}

Mas o Pattern é da biblioteca Java. O que eu queria saber é se tem um método equivalente na biblioteca do Kotlin?

2 respostas

E vou deixar aqui também a resolução que consegui dos outros exercícios:

22- Java Alterando o formato de uma data e 23 Java Alterando o separador:

import org.junit.jupiter.api.Test
import java.util.regex.Pattern
import kotlin.test.assertEquals

class RegexData {
    private val pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})")
    private val matcher = pattern.matcher("2007-12-31")
    @Test
    fun inverteDataComRegex(){
        if (matcher.find()){
            val format = String.format("%s-%s-%s", matcher.group(3), matcher.group(2), matcher.group(1))
            assertEquals("31-12-2007",format)
        }
    }
    @Test
    fun alteraPadraoDataComRegex(){
        if (matcher.find()){
            val novoFormato = matcher.group().replace("-", "/")
            assertEquals("2007/12/31",novoFormato)
        }
    }
}
solução!

Olá, Murilo!

No Kotlin, você pode utilizar a classe Regex para trabalhar com expressões regulares. Essa classe faz parte da biblioteca padrão do Kotlin e é uma alternativa ao Pattern do Java.

Para transpor o seu código para utilizar a classe Regex no Kotlin, você pode fazer da seguinte forma:

import org.junit.jupiter.api.Test
import kotlin.test.assertEquals

class RegexKotlin {
    private val regex = Regex("(\\d\\d)(\\w)")
    private val input = "11b22g33t"

    @Test
    fun encontraOPrimeiroPadrao(){
        val matchResult = regex.find(input)
        if (matchResult != null) {
            assertEquals("11b", matchResult.value)
            assertEquals("11", matchResult.groupValues[1])
            assertEquals("b", matchResult.groupValues[2])
        }
    }

    @Test
    fun quantidadeDeMatch(){
        val matchResult = regex.find(input)
        if (matchResult != null) {
            assertEquals(0, matchResult.range.start)
            assertEquals(3, matchResult.range.endInclusive + 1)
        }
    }

    @Test
    fun encontraTodosOsPadroes(){
        val matchResults = regex.findAll(input)
        val listaDeStrings = matchResults.map { matchResult ->
            val format = String.format("%s-%s-%s-[%d,%d]", matchResult.value, matchResult.groupValues[1],
                matchResult.groupValues[2], matchResult.range.start, matchResult.range.endInclusive + 1)
            format
        }.toList()
        assertEquals("[11b-11-b-[0,3], 22g-22-g-[3,6], 33t-33-t-[6,9]]", listaDeStrings.toString())
    }
}

Nesse código, utilizamos a função find para encontrar o primeiro padrão, a função findAll para encontrar todos os padrões e a propriedade value para obter o valor do padrão encontrado.

Espero ter ajudado e bons estudos!