簡體   English   中英

在NSRegularExpression模式中使用捕獲組

[英]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:&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實例生成NSTextCheckingResultNSTextCheckingResult具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM