2011-12-12 42 views
0

我正在開發一個iPhone應用程序,它將使用NSRegularExpression來匹配來自字符串的模式以提取信息。這裏我試圖從電子郵件標題中提取mailTo鏈接。我已經成功地檢索了電子郵件標題字符串,現在我正在使用NSregularExpression應用搜索模式來從標題字符串中獲取電子郵件標識。無法使用NSRegularExpression提取信息

這是從哪兒我想提取的mailto的標題文字:

List-Unsubscribe: <mailto:[email protected]n>?subject=Unsubscribe>,<http://suksh.mailserv.in/suksh/?p=unsubscribe&mid=5451&uid=d8135921c2e2d40400ab02fa31eda529>>

這是搜索模式:

mailto:(?<address>[^\?^>]+)\??(?<params>[^>]+)? 

我的代碼是這樣的

NSString *str= @"List-Unsubscribe: <mailto:[email protected]n>?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 o bject。

請幫助我什麼是問題。

預先感謝

+0

不知道這是否是唯一的問題,但你還沒有逃過正則表達式中的反斜槓。 – omz

+0

此外,沒有'regularExpressionWithPattern:'方法,它被稱爲'regularExpressionWithPattern:options:error:','error'參數應該會讓你知道你的表達有什麼問題。 – omz

回答

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. 
}