Trong quá trình lập trình ứng dụng web hoặc dịch vụ web, việc kiểm tra dữ liệu do người dùng nhập vào đóng hai vai trò: 1 - hạn chế người dùng nhầm lẫn trong quá trình nhập liệu; 2 - thiết lập ràng buộc đối với dữ liệu để không gây ra lỗi logic nghiệp vụ.

Mỗi giá trị dữ liệu đầu vào cần được kiểm tra thỏa mãn một trong hai, hoặc cả hai điều kiện:

  1. Dữ liệu phải có giá trị nằm trong khoảng giá trị hợp lệ của loại dữ liệu, chẳng hạn số tiền hợp lệ không được phép là giá trị âm, năm sinh hợp lệ của một sinh viên đăng ký vào đại học phải đảm bảo sinh viên đó không ít hơn 15 tuổi và không nhiều hơn 90 tuổi,v.v. Điều kiện hợp lệ này chỉ phụ thuộc vào nội tại của loại dữ liệu mà không có bất cứ ràng buộc nào với những dữ liệu đã đưa vào trước đó.
  2. Giá trị của dữ liệu phải thỏa mãn ràng buộc với một số dữ liệu đã có trong cơ sở dữ liệu. Chẳng hạn dữ liệu trong bản ghi được thêm vào là địa chỉ email của khách hàng - thuộc loại dữ liệu xác định duy nhất - thì địa chỉ email này không được phép tồn tại trước đó trong bảng dữ liệu khách hàng.

Trong bài viết này, chúng ta chỉ đề cập đến việc sử dụng Regular Expression để kiểm tra tính hợp lệ của dữ liệu thỏa mãn điều kiện thứ nhất ở trên.

Kiểm tra UUID hợp lệ

Phương thức static verifyUUID() kiểm tra chuỗi đầu vào có phải là một UUID hợp lệ không:

public static final String UUID_PATTERN =
    "^[a-fA-F0-9]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}$";

public static boolean verifyUUID(String uuid) {
    if (uuid == null) return false;
    return uuid.matches(UUID_PATTERN);
}

Giải thích ý nghĩa các thành phần của Regexp Pattern:

^                           # start-of-string
    [a-fA-F0-9]{8}          # 8 hexa-digits
        -?                  # separated by a dash (optional)
    [a-fA-F0-9]{4}          # 4 hexa-digits
        -?                  # separated by a dash (optional)
    [a-fA-F0-9]{4}          # 4 hexa-digits
        -?                  # separated by a dash (optional)
    [a-fA-F0-9]{4}          # 4 hexa-digits
        -?                  # separated by a dash (optional)
    [a-fA-F0-9]{12}         # 12 hexa-digits
$                           # end-of-string

Kiểm tra Username hợp lệ

Phương thức static verifyUsername() kiểm tra chuỗi đầu vào có phải là một Username hợp lệ không:

private static final String USERNAME_PATTERN = "^[a-z0-9_-]{3,16}$";

public static boolean verifyUsername(String username) {
    if (username == null) return false;
    return username.matches(USERNAME_PATTERN);
}

Giải thích ý nghĩa các thành phần của Regexp Pattern:

^                           # start-of-string
    [a-z0-9_-]              # contains alphabets, digits and dash
    {3,16}                  # from 3 to 16 characters
$                           # end-of-string

Kiểm tra Email hợp lệ

Phương thức static verifyEmail() kiểm tra chuỗi đầu vào có phải là một Email hợp lệ không:

private static final String EMAIL_PATTERN =
		"^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
		+ "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

public static boolean verifyEmail(String email) {
    if (email == null) return false;
    return email.matches(EMAIL_PATTERN);
}

Giải thích ý nghĩa các thành phần của Regexp Pattern:

^                           # start-of-string
    [_A-Za-z0-9-\\+]+       # contains one or more alphabets, digits, underscore, plus
    (\\.[_A-Za-z0-9-]+)*    # contains zero or more groups, each group has a dot following with one or more alphabets, digits and dash.
    @                       # "at" character
    [A-Za-z0-9-]+           # one or more alphabets, digits and dash.
    (\\.[A-Za-z0-9]+)*      # contains zero or more groups, each group has a dot following with one or more alphabets, digits.
    (\\.[A-Za-z]{2,})       # the last group, that has a dot following by more than 2 alphabets
$                           # end-of-string

Kiểm tra Password hợp lệ

Phương thức static verifyPassword() kiểm tra chuỗi đầu vào có phải là một Password hợp lệ không:

private static final String PASSWORD_PATTERN =
		"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$";

public static boolean verifyPassword(String password) {
    if (password == null) return false;
    return password.matches(PASSWORD_PATTERN);
}

Giải thích ý nghĩa các thành phần của Regexp Pattern:

^                           # start-of-string
    (?=.*[0-9])             # a digit must occur at least once
    (?=.*[a-z])             # a lower case letter must occur at least once
    (?=.*[A-Z])             # an upper case letter must occur at least once
    (?=.*[@#$%^&+=])        # a special character must occur at least once
    (?=\S+$)                # no whitespace allowed in the entire string
    .{8,}                   # anything, at least eight places though
$                           # end-of-string

Kiểm tra Họ và tên hợp lệ

Phương thức static verifyFullname() kiểm tra chuỗi đầu vào có phải là trường Họ và tên hợp lệ không:

private static final String FULLNAME_PATTERN =
            "^[a-zA-Z_ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚĂĐĨŨƠàáâãèéêìíòóôõùúăđĩũơƯĂẠẢẤẦẨẪẬẮẰẲẴẶ" +
            "ẸẺẼỀỀỂưăạảấầẩẫậắằẳẵặẹẻẽềềểỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪễệỉịọỏốồổỗộớờởỡợ" +
            "ụủứừỬỮỰỲỴÝỶỸửữựỳỵỷỹ\\s]+$";

public static boolean verifyFullname(String fullname) {
    if (fullname == null) return false;
    return fullname.matches(FULLNAME_PATTERN);
}

Giải thích ý nghĩa các thành phần của Regexp Pattern:

^                           # start-of-string
    [
    a-zA-Z_                 # contains alphabets and underscore
    ÀÁÂ...ỵỷỹ               # characters in Vietnamese
    \\s                     # whitespace
    ]+                      # must contains one or more characters
$                           # end-of-string

Các bạn có thể tải mã nguồn đầy đủ của ví dụ minh họa để chạy thử.

Comments