以下形式的正则表达式在Obj C中是否合法?
"<(img|a|div).*?>.*?</$1>"
我知道它在JS中是有效的,而不是1美元,但我在Obj C中运气不佳。
答案 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:®exError];
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>