A veces necesitamos encontrar patrones en strings en Scala. Un caso muy común sería, por ejemplo, verificar si un String contiene una expresión regular.
Una posible solución para este problema sería crear un objeto Regex invocando el método .r en un String y luego usar ese patrón con la función findFirstIn cuando estemos buscando una sola coincidencia y findAllIn cuando deseemos todas las coincidencias.
A continuación veamos cómo trabajar con estos dos enfoques.
Encontrar la primera coincidencia
Lo primero que vamos a realizar es crear la expresión regular la cual deseamos buscar en el String. Para este ejemplo vamos a crear una expresión que busque una secuencia de uno o más caracteres numéricos.
val patronNum = "[0-9]+".r // scala.util.matching.Regex = [0-9]+
Usar el método .r en un String es la forma más fácil de crear un objeto Regex. Otro posible enfoque sería importar la clase Regex, crear una instancia de Regex y luego usar la instancia de la misma forma.
import scala.util.matching.Regex
val patronNum = Regex("[0-9]+")
Lo siguiente que vamos a realizar es crear un String de muestra sobre el cual podamos buscar coincidencias con el patrón creado anteriormente.
val frase = "Hoy es 02 de Enero del año 2023"
A continuación utilizamos el método findFirstIn para encontrar la primera coincidencia dentro del String.
val coincidencia1 = patronNum.findFirstIn(frase)
La salida generada por esta línea de código es la siguiente.
coincidencia1: Option[String] = Some(02)
Notemos como este método retorna un Option[String]. Una forma sencilla de pensar en Option es que contiene cero o un valor. Para el caso de la función findFisrtIn, si la búsqueda es exitosa devuelve el string "02" dentro de Some, es decir, Some(02). Sin embargo, si falla en encontrar el patrón en el string retorna None.
Si deseas aprender a trabajar con Apache Spark a través de Scala te invito a que te inscribas a mi curso:
Spark y Scala en Databricks: Big Data e ingeniería de datos
Trabajo desde niveles básicos hasta avanzados con RDD y DataFrame.
Como se puede observar findAllIn retorna un iterador el cual nos permite iterar sobre el resultado.
coincidencias.foreach(println)
El resultado de esta última línea de código es el siguiente.
02
2023
Si findAllIn no encuentra ningún resultado este retorna un iterador vacío. Si por ejemplo, necesitamos el resultado como vector podríamos agregar la función toVector después de la función findAllIn.
val coincidencias = patronNum.findAllIn(frase).toVector
Obteniendo como resultado:
coincidencias: Vector[String] = Vector(02, 2023)
Si no existen coincidencias esta última línea devuelve como resultado un vector vacío. Otros métodos como toList, toSeq y toArray también están disponibles de la misma forma que acabamos de demostrar.