¿Cómo transformar datos mediante expresiones regulares?
Otra de las tareas comunes que se realizan con expresiones regulares es la de limpiar datos de forma que estos puedan ser utilizados de forma segura.
Uno de los problemas comunes al ingresar datos es que se cometen errores al ingresarlos, algunos de estos errores son.
- Espacios dobles.
- Typos.
- Caracteres inválidos.
Retomando el ejemplo de la fecha, supongamos que se envía un conjunto de valores con errores, tenemos un ejemplo que sanitiza fechas.
package main
import (
"fmt"
"regexp"
)
func main() {
// datos de entrada
datosDeEntrada := []string{
"2019-01-01 00:00:00a",
"2019-01-01_ 00:00:00",
"2019-01-01 00:00:00",
}
// preparar la expresion regular
caracteresInvalidos := regexp.MustCompile("[^0-9 -:]")
multiplesEspacios := regexp.MustCompile("[ ]{2,}")
// sanitizar cada uno de los valores
for _, dato := range datosDeEntrada {
dato = caracteresInvalidos.ReplaceAllString(dato, "")
dato = multiplesEspacios.ReplaceAllString(dato, " ")
fmt.Println(dato)
}
}
Descripción del programa.
Los datos de entrada son 3 valores, el primero con una “a” al final del string. El segundo con un guión bajo, después de la fecha, y el tercero con un doble espacio.
datosDeEntrada := []string{
"2019-01-01 00:00:00a",
"2019-01-01_ 00:00:00",
"2019-01-01 00:00:00",
}
Primero hemos preparado una expresión regular para filtrar los caracteres inválidos. Esto quiere decir “todo aquello que no sea un numero, un espacio, o alguno de los caracteres guión y dos puntos.”
caracteresInvalidos := regexp.MustCompile("[^0-9 -:]")
También requerimos una expresión en la cual se filtren todos el espacio en blanco de 2 o mas.
multiplesEspacios := regexp.MustCompile("[ ]{2,}")
Ahora basta recorrer el slice mediante un bucle for para imprimir las salidas sanitizadas.
for _, dato := range datosDeEntrada {
dato = caracteresInvalidos.ReplaceAllString(dato, "")
dato = multiplesEspacios.ReplaceAllString(dato, " ")
fmt.Println(dato)
}
La salida del programa es la siguiente.
2019-01-01 00:00:00
2019-01-01 00:00:00
2019-01-01 00:00:00