Trabajando con Regex en Scala

Suraj P 16 febrero 2024
  1. Clase Regex en Scala
  2. Buscar coincidencias en texto en Scala
  3. Use Regex para reemplazar un texto en Scala
  4. Use Regex para extraer valores en Scala
  5. Conclusión
Trabajando con Regex en Scala

Las expresiones regulares definen un patrón común utilizado para hacer coincidir los datos de entrada. Estos son muy útiles para la coincidencia de patrones y el procesamiento o análisis de texto.

En este artículo, aprenderemos cómo trabajar con Regex (expresiones regulares) en Scala.

Clase Regex en Scala

Regex es una clase en Scala que se importa de scala.util.matching.Regex, basada en el paquete de Java java.util.regex, que se usa ampliamente para la coincidencia de patrones y el análisis de texto. Los objetos Regex se pueden crear de dos maneras.

El primer método es crear explícitamente el objeto de clase Regex.

val x = new Regex("you")

El segundo método es utilizar el método r.

val x = "You".r

Veamos diferentes casos de uso para expresiones regulares con Regex.

Buscar coincidencias en texto en Scala

Encontrar coincidencias en el texto es uno de los casos de uso más comunes de Regex.

Código de ejemplo:

import scala.util.matching.Regex
object myClass
{
    def main(args: Array[String])
    {
        val x = new Regex("Tony")
        val text = "Iron man is also known as Tony Stark. Tony is an Avenger"

        println(x findFirstIn text)
    }
}

Producción :

Some(Tony)

Ejecutar código

En el código anterior, usamos el método findFirstIn para encontrar la primera coincidencia de la expresión regular, y el método devuelve un objeto Option[String].

Código de ejemplo:

import scala.util.matching.Regex
object myClass
{
    def main(args: Array[String])
    {
        val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
        val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"

        println((reg findAllIn text).mkString(","))
    }
}

Producción :

01-011,30-059

Ejecutar código

En el ejemplo anterior, usamos el método findAllIn para encontrar todas las coincidencias y devolver el MatchIterator. Luego usamos el método mkString para convertir la salida en una cadena separada por , (coma).

También tenemos el método findFirstMatchIn. Funciona como el método findFirstIn pero devuelve Option[Match].

Código de ejemplo:

import scala.util.matching.Regex
object myClass
{
    def main(args: Array[String])
    {
        val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
        val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"

        val result = reg.findFirstMatchIn(text)
        println(Some("011"), for (x <- result) yield x.group(2))
    }
}

Producción :

(Some(011),Some(011))

Ejecutar código

Use Regex para reemplazar un texto en Scala

Este es otro caso de uso de Regex que está reemplazando texto. A veces, durante el análisis del texto, es posible que hayamos reemplazado alguna parte del mismo con otra cosa.

Código de ejemplo:

import scala.util.matching.Regex
object myClass
{
    // Main method
    def main(args: Array[String])
    {
        val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
        val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"

        println(reg replaceFirstIn(text, "1234"))
    }
}

Producción :

He lives in Warsaw 1234 and she lives in Cracow 30-059

Ejecutar código

En el código anterior, hemos usado el método replaceFirstIn para reemplazar la primera coincidencia encontrada en el texto con la cadena "1234".

Código de ejemplo:

import scala.util.matching.Regex
object myClass
{
    // Main method
    def main(args: Array[String])
    {
        val reg = new Regex("([0-9]{2})\\-([0-9]{3})")
        val text = "He lives in Warsaw 01-011 and she lives in Cracow 30-059"

        println(reg replaceAllIn(text, "1234"))
   }
}

Producción :

He lives in Warsaw 1234 and she lives in Cracow 1234

Ejecutar código

En el código anterior, usamos el método replaceAllIn, que reemplaza todas las coincidencias encontradas en el texto con "1234".

Use Regex para extraer valores en Scala

Cuando encontramos una coincidencia con expresiones regulares, podemos usar Regex para extraer valores usando la coincidencia de patrones.

Código de ejemplo:

import scala.util.matching.Regex
object myClass {

    def main(args: Array[String]) {
        val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
        val time = "12:20:01.411" match {
            case timestamp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
        }
    }
}

Producción :

It is 20 minutes after 12

Ejecutar código

En Scala, Regex por defecto se comporta como si el patrón estuviera anclado. Por ejemplo, el patrón se coloca en medio de los caracteres ^ y $ como ^pattern$, pero podemos eliminar estos caracteres usando el método unanchored, que está presente en la clase UnanchoredRegex.

Con esta ayuda, podemos tener texto adicional en nuestra cadena y aun así encontrar lo que necesitamos.

Código de ejemplo:

import scala.util.matching.Regex
object myClass
{
    def main(args: Array[String]) {
        val timestamp = "([0-9]{2}):([0-9]{2}):([0-9]{2}).([0-9]{3})".r
        val temp = timestamp.unanchored
        val time = "It is 12:20:01.411 in New York" match {
            case temp(hour, minutes, _, _) => println(s"It is $minutes minutes after $hour")
        }
    }
}

Producción :

It is 20 minutes after 12

Ejecutar código

Java hereda la mayoría de sus expresiones regulares y sus características Regex del lenguaje de programación Perl, y Scala hereda su sintaxis de expresiones regulares de Java.

Veamos algunas de las expresiones regulares de uso común de Scala tomadas de Java.

subexpresión Partidos
^ Coincide con el principio de la línea.
$ Coincide con el principio del fin.
[...] Se utiliza para hacer coincidir cualquier carácter individual presente en el paréntesis.
[^...] Se utiliza para hacer coincidir cualquier carácter individual que no esté presente en el paréntesis.
\\w Se utiliza para hacer coincidir los caracteres de la palabra.
\\d Se utiliza para hacer coincidir los dígitos.

Conclusión

En este artículo, hemos aprendido sobre la clase Regex presente en la biblioteca estándar de Scala. También hemos visto como proporciona diferentes APIs, que nos ayudan a lidiar con los diferentes casos de uso de las expresiones regulares.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub