【问题标题】:Unable to extract information using NSRegularExpression无法使用 NSRegularExpression 提取信息
【发布时间】:2011-12-12 15:42:57
【问题描述】:

我正在开发一个 iPhone 应用程序,它将使用 NSRegularExpression 从字符串中匹配模式以提取信息。在这里,我试图从电子邮件标题中提取 mailTo 链接。我已成功检索到电子邮件标头字符串,现在我正在使用 NSregularExpression 应用搜索模式以从标头字符串中获取电子邮件 ID。

这是我要从中提取 mailTo 的标题文本:

取消订阅列表:?subject=Unsubscribe>,>

这是搜索模式:

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 对象。

请帮助我可能是什么问题。

提前致谢

【问题讨论】:

  • 不确定这是否是唯一的问题,但您没有转义正则表达式中的反斜杠。
  • 另外,没有 regularExpressionWithPattern: 方法,它被称为 regularExpressionWithPattern:options:error: 和 error 参数应该让您知道您的表达式有什么问题。

标签: objective-c


【解决方案1】:

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

NSRegularExpression 和 ICU 文档均未提及对命名捕获组的支持 ((?&lt;name&gt;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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2019-09-17
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多