lu *_*uan 1 email ios nsdatadetector
我正在使用以下代码来检测字符串中的电子邮件.除了处理具有纯数字前缀的电子邮件,例如"536264846@gmail.com"之外,它工作正常.是否有可能克服苹果的这个错误?任何帮助将不胜感激!
NSString *string = @"536264846@gmail.com";
NSError *error = NULL;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];
NSArray *matches = [detector matchesInString:string
options:0
range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in matches) {
if ([match.URL.scheme isEqualToString:@"mailto"]) {
NSString *email = [match.URL.absoluteString substringFromIndex:match.URL.scheme.length + 1];
NSLog(@"email :%@",email);
}else{
NSLog(@"[match URL] :%@",[match URL]);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:日志结果为:[匹配网址]:http://gmail.com
我过去做了什么:
标记化输入,例如,使用空格分隔标记(因为大多数其他常见分隔符可能在电子邮件中有效).但是,如果正则表达式没有锚定,则可能没有必要 - 但不确定如果没有"^"和"$"锚点(我添加到网站上显示的内容)它将如何工作.
请记住,地址可以采用"字符串"形式以及地址
在每个令牌中,查找"@",因为它可能是您拥有该电子邮件地址的最佳指标
通过此电子邮件检测器比较网站上显示的正则表达式运行令牌(我在测试中发现截至2013年3月21 日标记为#1的工作效果最佳)
我所做的是将正则表达式放在一个文本文件中,所以我不需要转义它:
^(?!?(:(:\ X22\x5C [\ x00-\x7E]\X22)|(?:????\ X22 [^\x5C\X22]\X22)){255}) (?!?(:(:\ X22\x5C [\ x00-\x7E]\X22)|(?:????\ X22 [^\x5C\X22]\X22)){65} @) ?(:(:[\ X21\x23-\X27\X2A\X2B\X2D\x2F-\X39\X3D\X3F\x5E-\x7E] +)|(?:\ X22(:[\ x01-?\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F] |(?:\ x5C [\ x00-\x7F]))\ x22))(?:.(?: (|:([\ X21\x23-\X27\X2A\X2B\X2D\x2F-\X39\X3D\X3F\x5E-\x7E] +):?\ X22(:[\ x01-\X08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F] |(?:\ x5C [\ x00-\x7F]))\x22)))@(?:(?:(?? ! [^.] {64,})(?:(?:(?:xn - )?[a-z0-9] +(?: - [a-z0-9] +).){1,126 }){1,}(?:(?:[az] [a-z0-9])|(?:( ?: xn - )[a-z0-9] +))(?: - [a -z0-9] +))|(?:[(?:(?:IPv6 :(?:(?:[a-f0-9] {1,4}(?:: [a-f0-9] {1,4}){7})|(?:(?!(?:. [a-f0-9] [:]]){7,})(?:[a-f0-9] {1 ,4}(:: [A-f0-9] {1,4}?){0,5})::(:???[A-f0-9] {1,4}(:: [一-f0-9] {1,4}){0,5}))))|(:( ?: IPv6的:(:(:[A-f0-9] {1,4}(???? :: [A-f0-9] {1,4}){5} :) |(?:?!?.((:*[A-f0-9]){5})?(:一个-f0-9] {1,4} {0,3})::((:: [A-f0-9] {1,4}):?[A-f0-9] {1, 4}(:: [A-f0-9] {1,4}?){0,3}:))))(:( ?: 25 [0-5])|(:????2 0-4] [0-9])|(?:1 [0-9] {2})|(:[1-9] [0-9]))(:(:(?????? :25 [0-5 ])|(:2 [0-4] [0-9])|(?:1 [0-9] {2})|(:???[1-9] [0-9]))) {3}))))$
定义了一个伊娃:
NSRegularExpression *reg
Run Code Online (Sandbox Code Playgroud)
创建正则表达式:
NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"EMailRegExp" ofType:@"txt"];
NSString *pattern = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:NULL];
NSError *error = nil;
reg = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];
assert(reg && !error);
Run Code Online (Sandbox Code Playgroud)
然后写了一个方法来做比较:
- (BOOL)isValidEmail:(NSString *)string
{
NSTextCheckingResult *match = [reg firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
return match ? YES : NO;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:对于更改,不那么严谨但更快,请参阅此问题的评论部分
| 归档时间: |
|
| 查看次数: |
1412 次 |
| 最近记录: |