Является ли регулярное выражение следующей формы законным в Obj C?
"<(img|a|div).*?>.*?</$1>"
Я знаю, что это допустимо в JS с \1 вместо $1, но мне не повезло с Obj C.
Является ли регулярное выражение следующей формы законным в Obj C?
"<(img|a|div).*?>.*?</$1>"
Я знаю, что это допустимо в JS с \1 вместо $1, но мне не повезло с Obj C.
NSRegularExpression использует Регулярные выражения ICU, использующие синтаксис \n
для обратных ссылок, где n
– n-я группа захвата.
<(img|a|div).*?>.*?</\\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, но использую дополнительный модуль, который просматривает HTML с помощью запросов XPath, TFHpple — спасение, если вам абсолютно необходимо анализировать HTML), я использую -[NSRegularExpression firstMatchInString:options:range:]
для проверки первого экземпляра тега, соответствующего моему шаблону регулярного выражения. Из этого NSTextCheckingResult
я вытаскиваю правильный индекс интересующей меня группы захвата (в данном случае [regexResults rangeAtIndex:1]
)
Но добраться до этого момента было огромной головной болью. Но чтобы убедиться, что вы получаете правильные выражения, я настоятельно рекомендую использовать Regex101 с настройкой Python, а затем передать уточненный регулярное выражение в Шаблоны (Mac App Store)
Если вам нужен полный вид, у меня есть довольно подробный проект здесь, но имейте в виду, что это все еще WIP.
NSRegularExpression
документы и следили за ними? ссылка в первом абзаце на синтаксис регулярного выражения ICU? - person CRD   schedule 09.03.2015\1
(@"... </\\1>"
) вместо$1
. - person Joe   schedule 10.03.2015