Trabajando con Regex en Scala
-
Clase
Regex
en Scala - Buscar coincidencias en texto en Scala
-
Use
Regex
para reemplazar un texto en Scala -
Use
Regex
para extraer valores en Scala - Conclusión
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)
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
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))
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
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
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
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
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
.