[Swift] Regex ngày tháng năm với định dạng yyyy/MM/dd

[Swift] Regex ngày tháng năm với định dạng yyyy/MM/dd

Hello ae.

Nhân dịp chưa có blog nào về Swift, hôm nay mình sẽ giới thiệu 1 biểu thức giúp tiết kiệm rất nhiều thời gian và não cho ae.


Như tiêu đề, đối với trường hợp chọn ngày tháng từ DatePicker thì quá dễ dàng, nhưng khi yêu cầu của app là cho phép người dùng nhập ngày tháng năm từ bàn phím thì sẽ hơi khó nhằn hơn 1 chút vì chúng ta sẽ phải check tháng nào có 30(31) ngày và tháng 2 của năm nào có 28(29) ngày.

Sau 1 ngày bơi trên stackoverflow thì mình cũng tìm đc biểu thức regex chuẩn cho định dạng yyyy/mm/dd này:

^(?:\d{4}\/(?:(?:(?:(?:0[13578]|1[02])\/(?:0[1-9]|[1-2][0-9]|3[01]))|(?:(?:0[469]|11)\/(?:0[1-9]|[1-2][0-9]|30))|(?:02\/(?:0[1-9]|1[0-9]|2[0-8]))))|(?:(?:\d{2}(?:0[48]|[2468][048]|[13579][26]))|(?:(?:[02468][048])|[13579][26])00)\/02\/29)$

Để kiểm tra, ae có thể vào trang này nhé:

Test thử với tháng 2 của năm 2021 (chỉ có 28 ngày), nếu ta nhập 2021/02/29 thì sẽ bị báo lỗi "does not match".

Cách dùng regex trong swift:

struct MyRegex {
    let regex: NSRegularExpression
    
    init(_ pattern: String) {
        self.regex = NSRegularExpression(pattern: pattern,
                                         options: .caseInsensitive)
    }
    
    func match(input: String) -> Bool {
        if let matches = regex.matches(in: input,
                                                options: [],
                                                range: NSMakeRange(0, (input as NSString).length)) {
            return matches.count > 0
        } else {
            return false
        }
    }
}
Tạo một regex util struct để có thể dùng ở nhiều nơi
let regEx = *biểu thức regex* //String here

let isValidated = MyRegex(regEx) //bool here

if (isValidated) {
	//do something...
} else {
	//do something...
}
Ví dụ

Chúc ae thành công ^^