Anda seharusnya tidak mencoba menggunakan regex untuk memvalidasi email. Dengan TLD yang terus berubah, validator Anda tidak lengkap atau tidak akurat. Sebaliknya, Anda harus memanfaatkan NSDataDetectorperpustakaan Apple yang akan mengambil string dan mencoba untuk melihat apakah ada bidang data yang diketahui (email, alamat, tanggal, dll). SDK Apple akan melakukan banyak hal untuk tetap mengikuti perkembangan TLD dan Anda dapat mendukung upaya mereka !! :)
Selain itu, jika iMessage (atau bidang teks lainnya) tidak menganggapnya sebagai email, haruskah Anda mempertimbangkan email?
Saya menempatkan fungsi ini dalam NSStringkategori, jadi string yang Anda uji adalah 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]]);
}
atau sebagai Stringekstensi cepat
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)"
}
}