Xin chào các bạn, hôm nay Ngô Tôn .IT gửi tới các bạn bài viết có tên Regex for valid email address excluding specific domain (mình cũng không biết dịch ra Tiếng Việt sao cho hay nên mình để nguyên Tiếng Anh cho dễ hiểu 🙂 ). Cụ thể là, mình sẽ validate địa chỉ email và loại trừ ra một số domain như là Gmail chẳng hạn.
Trong bài viết này, mình sử dụng Spring Boot các bạn cũng có thể áp dụng regex này ở các ngôn ngữ khác.
Regex (hay Regular Expression) là gì?
Cách đây cũng khá lâu mình có viết một bài Regular Expression trong JavaScript, và mình cũng có giới thiệu sơ qua nội dung Regex là gì. Các bạn có thể vào đọc lại nhé!
Regex for valid email address excluding specific domain in Spring Boot
Trong Java Spring Boot, để validate 1 object chúng ta thường dùng javax.validation hoặc org.hibernate.validator
Ví dụ:
1 2 3 4 5 6 7 8 |
public class AccountForm implements Serializable { @NotBlank @Length(max = 256) @Email String email; public String getEmail() { return email; } } |
1 2 3 4 5 6 7 8 9 10 |
@RequestMapping(value = "/add", method = RequestMethod.POST) public String addAccount(@Validated @ModelAttribute("form") AccountForm form, BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes) { if (bindingResult.hasErrors()) { model.addAttribute("message", "Email address is invalid"); return "account/add"; } } |
Với @Email annotation là chúng ta có thể validate được một địa chỉ email bất kì có hợp lệ hay không.
Và bây giờ, với yêu cầu chúng ta cần chấp nhận hết các địa chỉ email hợp lệ và loại trừ ra các địa chỉ email của Gmail, như là gmail.com, gmail.com.vn,…
Chúng ta cần tạo một pattern để thực hiện việc validate.
Regex chúng ta sẽ viết như sau:
1 |
.+@(?!(gmail\.com+(?:\.[a-z]+)?)$)[a-zA-Z0-9.-]+\.[a-z] |
Sau đó, chúng ta thêm vào pattern
1 2 3 4 5 6 7 8 9 |
public class AccountForm implements Serializable { @NotBlank @Length(max = 256) @Email @Pattern(regexp = ".+@(?!(gmail\\.com+(?:\\.[a-z]+)?)$)[a-zA-Z0-9.-]+\\.[a-z]+") String email; public String getEmail() { return email; } } |
Pattern chúng ta sẽ viết như sau: “chuỗi bất kỳ”@(“ngoại trừ domain”) “domain còn lại”
Ở đây, chúng ta chỉ cần dùng phép phủ định trong RegEx là (?![domain])
Chúng ta cũng cần loại trừ các phần tên miền theo quốc gia, ta sẽ thêm vào một optional (?:)?
Vậy là xong, các bạn hãy chạy thử xem sao nhé!
Leave a Reply