我正在开发一个iPhone应用程序,它将使用NSRegularExpression来匹配字符串中的模式以提取信息。在这里,我试图从电子邮件标题中提取mailTo链接。我已经成功检索了电子邮件标题字符串,现在我使用NSregularExpression应用搜索模式来从标题字符串中获取电子邮件ID。
这是我想要提取mailTo的标题文本:
列表 - 取消订阅:< mailto:suksh-1142-5451-d8135921c2e2d40400ab02fa31eda529@usub.mailserv.in>?subject =取消订阅>,< http://suksh.mailserv.in/suksh/?p = unsubscribe& MID = 5451&安培; UID = d8135921c2e2d40400ab02fa31eda529>>
这是搜索模式:
mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)?
我的代码就像这样
NSString *str= @"List-Unsubscribe: <mailto:suksh-1142-5451-d8135921c2e2d40400ab02fa31eda529@usub.mailserv.in>?subject=Unsubscribe>,<http://suksh.mailserv.in/suksh/?p=unsubscribe&mid=5451&uid=d8135921c2e2d40400ab02fa31eda529>>";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)?"];
NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:str options:0 range:NSMakeRange(0, [str length])];
if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
NSString *substringForFirstMatch = [str substringWithRange:rangeOfFirstMatch];
NSLog(@"Extracted URL: %@",substringForFirstMatch);
}
但是当我要在regularExpressionWithPattern:
的帮助下创建NSRegularExpression对象时,它将返回nil对象。
请帮助我解决可能存在的问题。
提前致谢
答案 0 :(得分:1)
模式字符串将被处理两次:一次由编译器处理,然后由NSRegularExpression
处理。您必须转义反斜杠以确保编译器不处理每个“\?”。
NSRegularExpression
和ICU文档均未提及对命名捕获组的支持((?<name>pattern)
);这可能导致模式解析失败或匹配失败。
创建正则表达式时使用regularExpressionWithPattern:options:error:
,这样就可以获得error对象,这将告诉您构造失败的原因。
NSError *theError;
// '?\?(' is to prevent '??(' from being interpreted as a trigraph
NSString *pattern = @"mailto:(?<address>[^\\?^>]+)\\?\?(?<params>[^>]+)?";
NSRegularExpression *regex;
NSRange rangeOfFirstMatch;
regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:0 error:&theError];
if (regex) {
rangeOfFirstMatch = [regex rangeOfFirstMatchInString:str
options:0 range:NSMakeRange(0, [str length])];
if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
NSString *substringForFirstMatch = [str substringWithRange:rangeOfFirstMatch];
NSLog(@"Extracted URL: %@",substringForFirstMatch);
}
} else {
// couldn't compile RE
NSAlert *errorAlert;
if (theError) {
errorAlert = [NSAlert alertWithError:theError];
} else {
NSString *errorMsg = @"Couldn't parse unsubscribe header because the pattern /%@/ isn't a valid regular expression.";
errorAlert = [NSAlert
alertWithMessageText:@"Invalid Pattern"
defaultButton:nil
alternateButton:nil
otherButton:nil
informativeTextWithFormat:[NSString stringWithFormat:errorMsg, pattern]];
}
[theAlert runModal]; // Ignore return value.
}