Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何提取文本中的电子邮件/邮箱字符串列表或测试字符串是否为正确的电子邮件地址?_Ios_Objective C_Macos_Nsdatadetector - Fatal编程技术网

Ios 如何提取文本中的电子邮件/邮箱字符串列表或测试字符串是否为正确的电子邮件地址?

Ios 如何提取文本中的电子邮件/邮箱字符串列表或测试字符串是否为正确的电子邮件地址?,ios,objective-c,macos,nsdatadetector,Ios,Objective C,Macos,Nsdatadetector,给定一些任意文本,我想提取所有电子邮件地址和“邮箱说明符”(例如,“Fred Smith”)。我查看了NSDataDetector,但它不处理电子邮件地址。实现这一点的方法是获得一个非常好的算法,该算法可以检测尽可能多的有效地址,并拒绝不正确的地址。最好的解决方案可能是使用lex和yacc构造解析器,但是使用正则表达式存在合理的解决方案 请参阅本文,了解已测试正则表达式的列表,以及对问题和可能解决方案的更深入讨论 上面站点上显示的正则表达式是为PHP格式化的,并且具有前导和尾随的“/”标记,以及

给定一些任意文本,我想提取所有电子邮件地址和“邮箱说明符”(例如,
“Fred Smith”
)。我查看了NSDataDetector,但它不处理电子邮件地址。

实现这一点的方法是获得一个非常好的算法,该算法可以检测尽可能多的有效地址,并拒绝不正确的地址。最好的解决方案可能是使用lex和yacc构造解析器,但是使用正则表达式存在合理的解决方案

请参阅本文,了解已测试正则表达式的列表,以及对问题和可能解决方案的更深入讨论

上面站点上显示的正则表达式是为PHP格式化的,并且具有前导和尾随的“/”标记,以及指示不区分大小写的“标志”等(有关更多信息,请参见此),因此在Objective-C项目中使用该表达式之前,需要去掉这些标记。此外,任何锚也需要剥离,因为我们需要多个地址,而不仅仅是一个地址(即“^”和“$”)

NSRegularExpression是此处要使用的类。我发现将正则表达式存储在我的项目中的一个文件中是很有帮助的,这样您就不必担心转义所有的反斜杠和引号。然后,代码将表达式读入字符串,并按如下方式创建对象:

NSString *fullPath = [[NSBundle mainBundle] pathForResource:self.regex ofType:@"txt"];
NSString *pattern = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:NULL];
__autoreleasing NSError *error = nil;
reg = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error]; // some patterns may not need NSRegularExpressionCaseInsensitive
assert(reg && !error);
初始化表达式后,使用它返回一个范围列表,每个范围都是一个地址:

NSArray *ret = [reg matchesInString:str options:0 range:NSMakeRange(0, [str length])];
但是,我们知道所有电子邮件地址都包含一个“@”,因此在处理该字符串之前,可能需要验证该字符串是否至少包含一个“@”。此外,由于文本中可能包含行和/或回车符,因此您可能希望首先剥离这些行和/或回车符。可能最好将它们完全剥离,因为某些邮件程序可能在地址的某个内部点拆分了一行

一旦你有了一个地址范围列表,那么大部分工作就完成了——如果你想要的只是地址的话。但是,地址通常以“邮箱说明符”格式显示,其中在地址前面加上名称,地址用“”包装。第3.4节中介绍了此格式


若要从“邮箱说明符”中恢复名称,请检查地址是否用“”包装,如果是,则查找“NSRegularExpressions”前面的字符串可能会很费钱。请查看。它包括许多方法,用于将地址数组转换为RFC标准字符串。@CodaFi。这是一个有趣的项目,值得一提g、 但是,在您提供的文件中,我看不到任何包含真正解析器的内容。当然,您可以查找包含在“”中的字符串,或由空格分隔并包含“@”的字符串,但随后您将从随机文本样本中获取假地址。使用正则表达式技术,虽然速度较慢,但实际上可以确保重新检测是真正有效的。在许多情况下,速度可能不是问题,但如果是的话,那么其他更快的方法肯定是值得的。这一切都取决于它们的分隔方式。如果数组只是垃圾,其中包含一些地址,那么你是对的,但是对于字符串数组,例如从web链接到电子邮件地址(激活信息合成),太棒了。