Я объявил NSRegularExpression. Например, как [0-9] {1,4} | abc | ABC. И я ввожу NSString: @ "123". Если я проверю NSTextCheckingResult, это не ноль. Итак, я знаю, что строка соответствует регулярному выражению. Однако могу ли я узнать больше о том, какая часть соответствует? Для этого сценария я знаю, что Regex [0-9] {1,4} соответствует. Как я могу это сделать? Спасибо!

seguedestination

Ответов: 2

Ответы (2)

Если я правильно понял ваш вопрос, вы должны использовать группы захвата (...):

NSString *pattern = @"([0-9]{1,4})|(abc)|(ABC)";

Если строка соответствует первой группе захвата в шаблоне затем

[result rangeAtIndex:1]

будет диапазоном совпадающей подстроки, а

[result rangeAtIndex:2]
[result rangeAtIndex:3]

иметь range.location == NSNotFound. Пример:

NSString *pattern = @"([0-9]{1,4})|(abc)|(ABC)";
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];

NSString *str = @"123";
NSTextCheckingResult *result = [regex firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];

NSLog(@"%@", NSStringFromRange([result rangeAtIndex:1])); // {0, 3}
NSLog(@"%@", NSStringFromRange([result rangeAtIndex:2])); // {9223372036854775807, 0}
NSLog(@"%@", NSStringFromRange([result rangeAtIndex:3])); // {9223372036854775807, 0}

Нажмите ⇧⌘0 и введите NSTextCheckingResult или - щелкните символ, чтобы получить определение класса.

Есть свойства диапазон, resultType, numberOfRanges и многие другие.

Или вызовите rangeOfFirstMatchInString: options: range в экземпляре NSRegularExpression, чтобы получить диапазон напрямую.

2022 WebDevInsider