Перевірка за шаблоном

Очищення даних у Java

Dennis Lee

Software Engineer

Навіщо потрібна перевірка за шаблоном

  • Дані мають відповідати певним форматам, щоб бути точними
  • Приклад: дати мають бути в єдиному форматі, як-от d-MMM-yy
  • Проблема: різні формати дат, наприклад «24/02/22»
  • Рішення: використовуйте перевірку за шаблоном, щоб знаходити несумісні формати

 

// Ми витягли ці дати з нашого набору даних
List<String> dates = Arrays.asList("4-Jan-22", "1-Aug-22", "7-Jul-22", 
                                   "27-Apr-22", "24/02/22");
Очищення даних у Java

Три типи перевірки за шаблоном

  • Повне зіставлення шаблону
    • Використовуйте, коли формат має бути точним
    • Приклад: перевірка дат у форматі d-MMM-yy
  • Пошук за шаблоном
    • Коли розташування не має значення
    • Приклад: пошук або перевірка категорій товарів в описах
    • Товари з «Dark Chocolate»: «85% Dark Chocolate Bar», «Dark Chocolate with Nuts»
  • Зіставлення символів
    • Для швидкого скринінгу даних
    • Приклад: перевірити, чи поле кількості містить літери («12.5x»)
Очищення даних у Java

Визначення шаблонів у regex

  • Зіставити шаблон дати d-MMM-yy (як «4-Jan-22»)
  • Regex: \\d{1,2}-[A-Za-z]{3}-\\d{2}

 

\\d{1,2}     // 1–2 цифри для дня (як 4 або 27)
-            // літерал дефіса як розділювач

[A-Za-z]{3} // рівно 3 літери для місяця, як Jan; великі або малі - // літерал дефіса як розділювач
\\d{2} // рівно 2 цифри для року (як 22)
Очищення даних у Java

Повне зіставлення шаблону

import java.util.regex.Pattern;
// Зіставлення d-MMM-yy
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");

for (String date : dates) { // Перевірити, чи date відповідає datePattern boolean isValid = datePattern.matcher(date).matches(); System.out.println(date + " is valid: " + isValid); }
Очищення даних у Java

Повне зіставлення: результати

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
Очищення даних у Java

Пошук за шаблоном

import java.util.regex.Matcher;
Pattern monthPattern = Pattern.compile("[A-Za-z]{3}"); // 3 літери, як «Jan»

for (String date : dates) { Matcher matcher = monthPattern.matcher(date); // Чи міститься monthPattern у date?
if (matcher.find()) { // Повертає true, якщо шаблон знайдено
// matcher.group() повертає збіг System.out.println("Month found: " + matcher.group()); } else { System.out.println("No month found in: " + date); } }
Очищення даних у Java

Пошук за шаблоном: результати

Month found: Jan
Month found: Aug
Month found: Jul
Month found: Apr
No month found in: 24/02/22
Очищення даних у Java

Зіставлення символів

import com.google.common.base.CharMatcher;
for (String date : dates) {
    boolean isValid =
            // Перевірка на наявність цифр у date
            CharMatcher.inRange('0', '9').matchesAnyOf(date) &&

// Перевірка на наявність літер (великі та малі) у date CharMatcher.inRange('a', 'z') .or(CharMatcher.inRange('A', 'Z')).matchesAnyOf(date) &&
CharMatcher.is('-').matchesAnyOf(date); // Перевірка на дефіси у date System.out.println(date + " has valid characters: " + isValid); }
Очищення даних у Java

Зіставлення символів: результати

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
Очищення даних у Java

Об'єднуємо все разом

// Визначити шаблон d-MMM-yy, як 4-Jan-22
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");
// Повне зіставлення (чи відповідає date datePattern?)
boolean matchesPattern = datePattern.matcher(date).matches();
// Пошук за шаблоном (чи має date підрядок місяця?)
boolean hasMonth = Pattern.compile("[A-Za-z]{3}").matcher(date).find();
// Зіставлення символів (чи містить date цифри?)
boolean hasDigits = CharMatcher.digit().matchesAnyOf(date);
Очищення даних у Java

Давайте потренуємось!

Очищення даних у Java

Preparing Video For Download...