2011-11-19 34 views
9

tôi muốn sử dụng Lớp NSRegularExpression để xác thực nếu một địa chỉ email là NSString.NSRegularExpression xác thực email

Something như giả này:

- (BOOL)validateMail : (NSString *)email 
{ 
    NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"" options:NSRegularExpressionCaseInsensitive error:NULL]; 

    if(emailValidated) 
    { 
     return YES; 
    }else{ 
     return NO; 
    } 
} 

Nhưng tôi không biết làm thế nào chính xác tôi xác nhận một NSString nếu nó đang tìm kiếm như thế này "[email protected]"

Có lẽ ai đó có thể giúp tôi đây.

Greetings s4lfish

Trả lời

31

Bạn có thể sử dụng:

@"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 

bạn có thể kiểm tra nó ở đây:

http://gskinner.com/RegExr/?2rhq7

Và lưu liên kết này nó sẽ giúp bạn với Regex trong tương lai :

http://gskinner.com/RegExr/

EDIT

Bạn có thể làm theo cách này:

NSString *string = @"[email protected]"; 
NSString *expression = @"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 
NSError *error = NULL; 

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 

    if (match){ 
     NSLog(@"yes"); 
    }else{ 
     NSLog(@"no"); 
    } 
+2

wow trông có vẻ lộn xộn –

+0

Cảm ơn, nhưng vấn đề của tôi là tôi không tìm thấy chức năng để chứng minh rằng email đã nhập phù hợp với regex. Tôi đã nhìn vào tài liệu của apple, nhưng bằng cách nào đó NSRegularExpression không có một hàm trả về giá trị boolean cho "if-statement" của tôi. – s4lfish

+2

Xin chào Tôi đã thêm một mẫu mã cho điều đó. Và BTW @Alex Nichol nó sẽ là tuyệt vời nếu bạn có thể giải thích bình luận của bạn. Tôi có thể sai trong câu trả lời của tôi nhưng liều bình luận của bạn không giúp tôi hoặc bất kỳ ai khác hiểu vấn đề này tốt hơn. – shannoga

8

Đây là một câu hỏi cũ, nhưng nó đủ tổng quát để không bao giờ đi ra khỏi phong cách.

99,9% địa chỉ email regex sai và thậm chí ít xử lý tên miền quốc tế (IDN) đúng cách.

Cố gắng tạo một regex email toàn diện không phải là sử dụng tốt thời gian phát triển hoặc chu kỳ CPU của người dùng.

Đây là đơn giản hơn nhiều:

  1. trận đấu [^@][email protected]([^@]+)

  2. Giải nén miền mỗi phần phù hợp.

  3. Không nếu nó khớp với miền bị cấm. Cache danh sách các miền bị cấm cục bộ từ một điểm cuối JSON, do đó bạn không phải chờ phê duyệt lại và có thể cập nhật nó một cách nhanh chóng. (Hãy nhớ ghi lại số liệu thống kê web để phân tích chuyển đổi.)

  4. Kiểm tra xem miền có bản ghi DNS hay không. Kiểm tra A và AAAA, ngoài MX, vì không phải tất cả các miền đều triển khai MX. (Lame nhưng đúng.)

  5. Chỉ cần thử gửi email đi. Người dùng sẽ thử lại nếu họ nhận thấy một ứng dụng có giá trị. :))

+0

đồng ý, Tên miền cấp cao nhất có thể nhiều hơn 4, chẳng hạn như 'community',' properties'. nghiêm ngặt hơn là tệ hơn là không có gì. – chao787

0

Swift 4 phiên bản

Tôi viết thư này cho những người đang làm Swift 4 phiên bản dành cho email biểu thức chính quy. Ở trên có thể được thực hiện như sau:

do { 
     let emailRegex = try NSRegularExpression(pattern: "^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$", options: .caseInsensitive) 
     let textRange = NSRange(location: 0, length: email.count) 
     if emailRegex.firstMatch(in: email, options: [], range: textRange) != nil { 
      //Do completion code here 
     } else { 
      //Do invalidation behaviour 
     } 
    } catch { 
     //Do invalidation behaviour 
    } 

Giả sử email là một chuỗi nhanh chóng được nhập.

Các vấn đề liên quan