Вы не должны пытаться использовать регулярное выражение для проверки электронной почты. При постоянном изменении TLD ваш валидатор либо неполный, либо неточный. Вместо этого вам следует использовать NSDataDetector
библиотеки Apple, которые будут брать строку и пытаться увидеть, есть ли какие-либо известные поля данных (электронные письма, адреса, даты и т. Д.). SDK от Apple сделает тяжелую работу по поддержанию актуальности TLD, и вы можете воспользоваться их усилиями !! :)
Кроме того, если iMessage (или любое другое текстовое поле) не считает, что это электронная почта, стоит ли вам рассматривать электронную почту?
Я поместил эту функцию в категорию NSString
, поэтому вы тестируете строку self
.
- (BOOL)isValidEmail {
// Trim whitespace first
NSString *trimmedText = [self stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
if (self && self.length > 0) return NO;
NSError *error = nil;
NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
if (!dataDetector) return NO;
// This string is a valid email only if iOS detects a mailto link out of the full string
NSArray<NSTextCheckingResult *> *allMatches = [dataDetector matchesInString:trimmedText options:kNilOptions range:NSMakeRange(0, trimmedText.length)];
if (error) return NO;
return (allMatches.count == 1 && [[[allMatches.firstObject URL] absoluteString] isEqual:[NSString stringWithFormat:@"mailto:%@", self]]);
}
или как быстрое String
расширение
extension String {
func isValidEmail() -> Bool {
let trimmed = self.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty, let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
return false
}
let allMatches = dataDetector.matches(in: trimmed, options: [], range: NSMakeRange(0, trimmed.characters.count))
return allMatches.count == 1 && allMatches.first?.url?.absoluteString == "mailto:\(trimmed)"
}
}
person
Mr. T
schedule
05.09.2017
NSPredicate
; люди, использующие iOS 4.0, могут использоватьNSRegularExpression
. - person benzado   schedule 23.05.2011NSDataDetector
в iOS для проверки адресов электронной почты: stackoverflow.com/a/23547905/257550 < / а> - person memmons   schedule 08.05.2014NSDataDetector
не существовало в iOS 2. - person Marcus S. Zarra   schedule 08.05.2014