Как получить шаблон MFA с помощью регулярных выражений в Objective-C? - PullRequest
0 голосов
/ 10 июня 2019

Я использую регулярное выражение ((.*)?:)?(.*)\\/([0-9]+|[n])? для сопоставления с шаблоном типа module:function/arity, где arity может быть любым числом> = 0 или строкой n.

Успешные случаи должны совпадать:

foo:bar/1
bar/1
foo:bar/0
foo:bar/n
bar/n

Кажется, это нормально работает на https://regex101.com/r/AtI5Nw/3,, но, используя следующий код, я получаю только одну группу совпадений для "mod:func/1".

+ (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string withExpression:(NSRegularExpression *)pattern {
    return [pattern matchesInString:string options:0 range:NSMakeRange(0, [string length])];
}

mfa

Я попытался с "mod:func/1" строкой, и я получаю только один матч. Как получить все подходящие группы, как на скриншоте? Я хочу получить части module, function и arity из строки.

1 Ответ

1 голос
/ 10 июня 2019

Прошло некоторое время с тех пор, как я это сделал, но ...

matchesInString:... возвращает массив NSTextCheckingResult объектов.Каждый объект представляет одно совпадение регулярного выражения whole в строке.

Каждый объект NSTextCheckingResult инкапсулирует несколько «диапазонов» (см. Свойство numberOfRanges).Затем вы используете rangeAtIndex: для извлечения диапазона каждой группы в этом экземпляре совпадения.

Если каждая цель находится в отдельной строке, вам не нужно matchesInString:..., просто используйте firstMatchInString:... для полученияодин и только NSTextCheckingResult для вашей строки.Затем вы можете извлечь каждую группу, получив ее диапазон, а затем вернуться к исходной строке, чтобы извлечь текст этого компонента.

...