在NSRegularExpression模式中使用捕获组

时间:2015-03-09 20:46:13

标签: ios objective-c regex swift nsregularexpression

以下形式的正则表达式在Obj C中是否合法?

"<(img|a|div).*?>.*?</$1>"

我知道它在JS中是有效的,而不是1美元,但我在Obj C中运气不佳。

2 个答案:

答案 0 :(得分:1)

是的,我相信你可以使用捕获组。我不得不在不久前和他们一起工作,我有一个例子:

-(NSString *) extractMediaLink:(NSString *)link withRegex:(NSString *)regex{
    NSString * utf8Link = [link stringByRemovingPercentEncoding]; 
    NSError * regexError = nil;

    NSRegularExpression * regexParser = [NSRegularExpression regularExpressionWithPattern:regex 
                                                                                  options:NSRegularExpressionCaseInsensitive|NSRegularExpressionUseUnixLineSeparators
                                                                                    error:&regexError];
    NSTextCheckingResult * regexResults =  [regexParser firstMatchInString:utf8Link
                                                                   options:0
                                                                     range:NSMakeRange(0, [utf8Link length])];

    NSString * matchedResults = [utf8Link substringWithRange:[regexResults rangeAtIndex:1]]; // the second capture group will always have the ID

    return matchedResults.length ? matchedResults : @"";
}

当您使用NSRegularExpression的实例生成NSTextCheckingResult时,NSTextCheckingResult的属性为numberOfRanges,其中包含以下内容:

  

结果必须至少有一个范围,但可以选择包含更多范围(例如,表示正则表达式捕获组)。

在上面的示例中(注意:我碰巧在解析HTML,但是使用了一个通过XPath查询遍历HTML的附加窗格,TFHpple - 如果你绝对需要解析HTML,那就是救生员),我使用-[NSRegularExpression firstMatchInString:options:range:]来检查与我的正则表达式模式匹配的第一个标记实例。从那个NSTextCheckingResult我拿出我感兴趣的捕获组的正确索引(在这种情况下,[regexResults rangeAtIndex:1]

但是,到目前为止,屁股是一个巨大的痛苦。但是为了确保您获得正确的表达式,我强烈建议您在Python设置中使用Regex101,然后将精炼的正则表达式传递给Patterns (Mac App Store)

如果你想要完整的外观,我有一个相当详细的项目here,但请记住,它仍然是一个WIP。

答案 1 :(得分:1)

NSRegularExpression使用ICU Regular Expressions\n语法用于n是第n个捕获组的后向引用。

<(img|a|div).*?>.*?</\\1>