[英]Using capture groups within an NSRegularExpression pattern
Obj C中以下形式的正則表達式是否合法?
"<(img|a|div).*?>.*?</$1>"
我知道在JS中使用\\ 1而不是$ 1是有效的,但是我在Obj C中運氣不佳。
是的,我相信您可以與捕獲小組合作。 我不得不在不久前與他們合作,並且在以下示例中:
-(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]
)
但是,到達這一點是一個巨大的痛苦。 但是為確保獲得正確的表達式,我強烈建議將Regex101與Python設置一起使用,然后將經過改進的正則表達式傳遞到Patterns(Mac App Store)
如果您想要完整的外觀,我在這里有一個相當詳細的項目,但是請記住,它仍然是一個WIP。
NSRegularExpression使用ICU正則表達式 ,該表達式使用\\n
語法進行反向引用,其中n
是第n個捕獲組。
<(img|a|div).*?>.*?</\\1>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.