Xác thực theo mẫu

Làm sạch dữ liệu bằng Java

Dennis Lee

Software Engineer

Vì sao cần xác thực theo mẫu

  • Dữ liệu cần theo đúng định dạng để chính xác
  • Ví dụ: ngày nên theo định dạng thống nhất như d-MMM-yy
  • Vấn đề: định dạng ngày không nhất quán như "24/02/22"
  • Giải pháp: dùng xác thực theo mẫu để tìm định dạng không nhất quán

 

// Chúng tôi trích xuất các ngày này từ tập dữ liệu
List<String> dates = Arrays.asList("4-Jan-22", "1-Aug-22", "7-Jul-22", 
                                   "27-Apr-22", "24/02/22");
Làm sạch dữ liệu bằng Java

Ba kiểu xác thực theo mẫu

  • Khớp toàn bộ mẫu
    • Dùng khi định dạng phải chính xác
    • Ví dụ: xác thực ngày theo định dạng d-MMM-yy
  • Tìm mẫu
    • Dùng khi vị trí không quan trọng
    • Ví dụ: tìm/kiểm tra danh mục sản phẩm trong mô tả
    • Sản phẩm có "Dark Chocolate": "85% Dark Chocolate Bar", "Dark Chocolate with Nuts"
  • Khớp ký tự
    • Dùng để sàng lọc nhanh
    • Ví dụ: kiểm tra trường số lượng có chữ cái không ("12.5x")
Làm sạch dữ liệu bằng Java

Định nghĩa mẫu bằng regex

  • Khớp mẫu ngày d-MMM-yy (như "4-Jan-22")
  • Regex: \\d{1,2}-[A-Za-z]{3}-\\d{2}

 

\\d{1,2}     // 1-2 chữ số cho ngày (như 4 hoặc 27)
-            // dấu gạch nối

[A-Za-z]{3} // đúng 3 chữ cho tháng như Jan; hoa hoặc thường - // dấu gạch nối
\\d{2} // đúng 2 chữ số cho năm (như 22)
Làm sạch dữ liệu bằng Java

Khớp toàn bộ mẫu

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

for (String date : dates) { // Kiểm tra date có khớp datePattern không boolean isValid = datePattern.matcher(date).matches(); System.out.println(date + " hợp lệ: " + isValid); }
Làm sạch dữ liệu bằng Java

Khớp toàn bộ mẫu: đầu ra

4-Jan-22 hợp lệ: true
1-Aug-22 hợp lệ: true
7-Jul-22 hợp lệ: true
27-Apr-22 hợp lệ: true
24/02/22 hợp lệ: false
Làm sạch dữ liệu bằng Java

Tìm mẫu

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

for (String date : dates) { Matcher matcher = monthPattern.matcher(date); // monthPattern có trong date không?
if (matcher.find()) { // Trả về true nếu tìm thấy mẫu
// matcher.group() trả về nội dung khớp System.out.println("Tìm thấy tháng: " + matcher.group()); } else { System.out.println("Không tìm thấy tháng trong: " + date); } }
Làm sạch dữ liệu bằng Java

Tìm mẫu: đầu ra

Tìm thấy tháng: Jan
Tìm thấy tháng: Aug
Tìm thấy tháng: Jul
Tìm thấy tháng: Apr
Không tìm thấy tháng trong: 24/02/22
Làm sạch dữ liệu bằng Java

Khớp ký tự

import com.google.common.base.CharMatcher;
for (String date : dates) {
    boolean isValid =
            // Kiểm tra chữ số trong date
            CharMatcher.inRange('0', '9').matchesAnyOf(date) &&

// Kiểm tra chữ cái (hoa và thường) trong date CharMatcher.inRange('a', 'z') .or(CharMatcher.inRange('A', 'Z')).matchesAnyOf(date) &&
CharMatcher.is('-').matchesAnyOf(date); // Kiểm tra dấu gạch nối trong date System.out.println(date + " có ký tự hợp lệ: " + isValid); }
Làm sạch dữ liệu bằng Java

Khớp ký tự: đầu ra

4-Jan-22 có ký tự hợp lệ: true
1-Aug-22 có ký tự hợp lệ: true
7-Jul-22 có ký tự hợp lệ: true
27-Apr-22 có ký tự hợp lệ: true
24/02/22 có ký tự hợp lệ: false
Làm sạch dữ liệu bằng Java

Tổng hợp

// Định nghĩa mẫu d-MMM-yy, như 4-Jan-22
Pattern datePattern = Pattern.compile("\\d{1,2}-[A-Za-z]{3}-\\d{2}");
// Khớp toàn bộ mẫu (date có khớp datePattern không?)
boolean matchesPattern = datePattern.matcher(date).matches();
// Tìm mẫu (date có chuỗi tháng không?)
boolean hasMonth = Pattern.compile("[A-Za-z]{3}").matcher(date).find();
// Khớp ký tự (date có chữ số không?)
boolean hasDigits = CharMatcher.digit().matchesAnyOf(date);
Làm sạch dữ liệu bằng Java

Hãy thực hành!

Làm sạch dữ liệu bằng Java

Preparing Video For Download...