Walidacja wzorców

Czyszczenie danych w Javie

Dennis Lee

Software Engineer

Po co stosować walidację wzorców

  • Dane muszą być zgodne z określonymi formatami
  • Przykład: daty powinny mieć spójny format, np. d-MMM-yy
  • Problem: niespójne formaty dat, np. „24/02/22"
  • Rozwiązanie: walidacja wzorców w celu wykrycia niespójności

 

// Daty wyodrębnione z naszego zbioru danych
List<String> dates = Arrays.asList("4-Jan-22", "1-Aug-22", "7-Jul-22", 
                                   "27-Apr-22", "24/02/22");
Czyszczenie danych w Javie

Trzy rodzaje walidacji wzorców

  • Pełne dopasowanie wzorca
    • Używaj, gdy format musi być dokładny
    • Przykład: walidacja dat w formacie d-MMM-yy
  • Wyszukiwanie wzorca
    • Używaj, gdy pozycja nie ma znaczenia
    • Przykład: wyszukiwanie kategorii produktów w opisach
    • Produkty z „Dark Chocolate": „85% Dark Chocolate Bar", „Dark Chocolate with Nuts"
  • Dopasowanie znaków
    • Używaj do szybkiego przesiewania danych
    • Przykład: sprawdzanie, czy pole ilości zawiera litery (np. „12.5x")
Czyszczenie danych w Javie

Definiowanie wzorców za pomocą wyrażeń regularnych

  • Dopasuj wzorzec daty d-MMM-yy (np. „4-Jan-22")
  • Wyrażenie regularne: \\d{1,2}-[A-Za-z]{3}-\\d{2}

 

\\d{1,2}     // 1–2 cyfry dla dnia (np. 4 lub 27)
-            // dosłowny separator myślnikowy

[A-Za-z]{3} // dokładnie 3 litery dla miesiąca, np. Jan; wielkie lub małe - // dosłowny separator myślnikowy
\\d{2} // dokładnie 2 cyfry dla roku (np. 22)
Czyszczenie danych w Javie

Pełne dopasowanie wzorca

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

for (String date : dates) { // Sprawdź, czy data pasuje do datePattern boolean isValid = datePattern.matcher(date).matches(); System.out.println(date + " is valid: " + isValid); }
Czyszczenie danych w Javie

Pełne dopasowanie wzorca: wyniki

4-Jan-22 is valid: true
1-Aug-22 is valid: true
7-Jul-22 is valid: true
27-Apr-22 is valid: true
24/02/22 is valid: false
Czyszczenie danych w Javie

Wyszukiwanie wzorców

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

for (String date : dates) { Matcher matcher = monthPattern.matcher(date); // Czy monthPattern jest w date?
if (matcher.find()) { // Zwraca true, jeśli wzorzec zostanie znaleziony
// matcher.group() zwraca dopasowaną zawartość System.out.println("Month found: " + matcher.group()); } else { System.out.println("No month found in: " + date); } }
Czyszczenie danych w Javie

Wyszukiwanie wzorców: wyniki

Month found: Jan
Month found: Aug
Month found: Jul
Month found: Apr
No month found in: 24/02/22
Czyszczenie danych w Javie

Dopasowanie znaków

import com.google.common.base.CharMatcher;
for (String date : dates) {
    boolean isValid =
            // Sprawdź cyfry w dacie
            CharMatcher.inRange('0', '9').matchesAnyOf(date) &&

// Sprawdź litery (wielkie i małe) w dacie CharMatcher.inRange('a', 'z') .or(CharMatcher.inRange('A', 'Z')).matchesAnyOf(date) &&
CharMatcher.is('-').matchesAnyOf(date); // Sprawdź myślniki w dacie System.out.println(date + " has valid characters: " + isValid); }
Czyszczenie danych w Javie

Dopasowanie znaków: wyniki

4-Jan-22 has valid characters: true
1-Aug-22 has valid characters: true
7-Jul-22 has valid characters: true
27-Apr-22 has valid characters: true
24/02/22 has valid characters: false
Czyszczenie danych w Javie

Podsumowanie

// Zdefiniuj wzorzec d-MMM-yy, np. 4-Jan-22
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");
// Pełne dopasowanie wzorca (czy data pasuje do datePattern?)
boolean matchesPattern = datePattern.matcher(date).matches();
// Wyszukiwanie wzorca (czy data zawiera podciąg miesiąca?)
boolean hasMonth = Pattern.compile("[A-Za-z]{3}").matcher(date).find();
// Dopasowanie znaków (czy data zawiera cyfry?)
boolean hasDigits = CharMatcher.digit().matchesAnyOf(date);
Czyszczenie danych w Javie

Czas na ćwiczenia!

Czyszczenie danych w Javie

Preparing Video For Download...