无法使用NSRegularExpression提取信息

时间:2011-12-12 06:21:20

标签: objective-c

我正在开发一个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对象。

请帮助我解决可能存在的问题。

提前致谢

1 个答案:

答案 0 :(得分:1)

模式字符串将被处理两次:一次由编译器处理,然后由NSRegularExpression处理。您必须转义反斜杠以确保编译器不处理每个“\?”。

NSRegularExpressionICU文档均未提及对命名捕获组的支持((?<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.
}