Validación de patrones

Limpieza de datos en Java

Dennis Lee

Software Engineer

Por qué necesitamos validación de patrones

  • Los datos deben seguir formatos específicos para ser precisos
  • Ejemplo: las fechas deben seguir un formato coherente como d-MMM-yy
  • Problema: formatos de fecha inconsistentes como "24/02/22"
  • Solución: usa validación de patrones para detectar formatos inconsistentes

 

// Extraímos estas fechas del conjunto de datos
List<String> dates = Arrays.asList("4-Jan-22", "1-Aug-22", "7-Jul-22", 
                                   "27-Apr-22", "24/02/22");
Limpieza de datos en Java

Tres tipos de validación de patrones

  • Coincidencia completa del patrón
    • Úsala cuando el formato deba ser exacto
    • Ejemplo: validar fechas que siguen el formato d-MMM-yy
  • Búsqueda de patrones
    • Úsala cuando la posición exacta no importe
    • Ejemplo: encontrar o comprobar categorías en descripciones
    • Productos con "Dark Chocolate": "85% Dark Chocolate Bar", "Dark Chocolate with Nuts"
  • Coincidencia de caracteres
    • Úsala para un filtrado rápido de datos
    • Ejemplo: comprobar si un campo de cantidad tiene letras ("12.5x")
Limpieza de datos en Java

Definir patrones con regex

  • Coincidir el patrón de fecha d-MMM-yy (como "4-Jan-22")
  • Regex: \\d{1,2}-[A-Za-z]{3}-\\d{2}

 

\\d{1,2}     // 1-2 dígitos para el día (como 4 o 27)
-            // guion literal como separador

[A-Za-z]{3} // exactamente 3 letras para el mes, como Jan; mayús. o minús. - // guion literal como separador
\\d{2} // exactamente 2 dígitos para el año (como 22)
Limpieza de datos en Java

Coincidencia completa del patrón

import java.util.regex.Pattern;
// Coincidir d-MMM-yy
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");

for (String date : dates) { // Comprobar si date coincide con datePattern boolean isValid = datePattern.matcher(date).matches(); System.out.println(date + " es válida: " + isValid); }
Limpieza de datos en Java

Coincidencia completa del patrón: salidas

4-Jan-22 es válida: true
1-Aug-22 es válida: true
7-Jul-22 es válida: true
27-Apr-22 es válida: true
24/02/22 es válida: false
Limpieza de datos en Java

Búsqueda de patrones

import java.util.regex.Matcher;
Pattern monthPattern = Pattern.compile("[A-Za-z]{3}"); // 3 letras como "Jan"

for (String date : dates) { Matcher matcher = monthPattern.matcher(date); // ¿monthPattern está en date?
if (matcher.find()) { // Devuelve true si encuentra el patrón
// matcher.group() devuelve el contenido coincidente System.out.println("Mes encontrado: " + matcher.group()); } else { System.out.println("No se encontró mes en: " + date); } }
Limpieza de datos en Java

Búsqueda de patrones: salidas

Mes encontrado: Jan
Mes encontrado: Aug
Mes encontrado: Jul
Mes encontrado: Apr
No se encontró mes en: 24/02/22
Limpieza de datos en Java

Coincidencia de caracteres

import com.google.common.base.CharMatcher;
for (String date : dates) {
    boolean isValid =
            // Comprobar dígitos en date
            CharMatcher.inRange('0', '9').matchesAnyOf(date) &&

// Comprobar letras (mayús. y minús.) en date CharMatcher.inRange('a', 'z') .or(CharMatcher.inRange('A', 'Z')).matchesAnyOf(date) &&
CharMatcher.is('-').matchesAnyOf(date); // Comprobar guiones en date System.out.println(date + " tiene caracteres válidos: " + isValid); }
Limpieza de datos en Java

Coincidencia de caracteres: salidas

4-Jan-22 tiene caracteres válidos: true
1-Aug-22 tiene caracteres válidos: true
7-Jul-22 tiene caracteres válidos: true
27-Apr-22 tiene caracteres válidos: true
24/02/22 tiene caracteres válidos: false
Limpieza de datos en Java

Juntándolo todo

// Definir patrón d-MMM-yy, como 4-Jan-22
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");
// Coincidencia completa (¿date cumple datePattern?)
boolean matchesPattern = datePattern.matcher(date).matches();
// Búsqueda de patrón (¿date tiene un mes como subcadena?)
boolean hasMonth = Pattern.compile("[A-Za-z]{3}").matcher(date).find();
// Coincidencia de caracteres (¿date tiene dígitos?)
boolean hasDigits = CharMatcher.digit().matchesAnyOf(date);
Limpieza de datos en Java

¡Vamos a practicar!

Limpieza de datos en Java

Preparing Video For Download...