Цель C - RegexKitLite - Разбор внутреннего содержимого строки, то есть: начало (.*?) Конец

NSString *myText = @"mary had a little lamb";
NSString *regexString = @"mary(.*?)little";

for(NSString *match in [myText captureComponentsMatchedByRegex:regexString]){

NSLog(@"%@",match);

}

Это выведет на консоль две вещи:

1) "Мэри немного" 2) "Была"

То, что я хочу, это просто 2-й бит информации "имел". Есть ли способ сопоставления строки и возврата только внутренней части?

Я довольно новичок в Objective C, это кажется довольно тривиальным вопросом, но я не могу найти менее грязный способ сделать это, чем увеличивать целое число в цикле for и на второй итерации, сохраняя "has a" в NSString,

2 ответа

Решение

При использовании регулярных выражений стандартным является то, что первое возвращаемое совпадение представляет собой всю совпавшую строку ("у mary было немного"), затем следующие элементы - это захваченные группы ("имело a").

-captureComponentsMatchedByRegex: возвращает NSArray из матчей. Итак, если вы хотите второй элемент или первую захваченную группу:

NSString *match = [[myText captureComponentsMatchedByRegex:regexString] objectAtIndex:1]

captureComponentsMatchedByRegex: возвращает все записи первого совпадения регулярного выражения. Индекс массива (он же захват) 0 это "весь текст соответствует регулярное выражение". Если регулярное выражение содержит дополнительные группы захвата, как это делает ваше регулярное выражение, эти индексы массива начинаются с 1 и продолжаются для такого количества групп захвата, которые присутствуют в регулярном выражении.

То, что вы, вероятно, хотите, это componentsMatchedByRegex:capture: метод. Этот метод возвращает массив всех совпадений в строке, в которую он отправляется, и дополнительно позволяет указать, какая группа захвата используется для создания массива результатов. Например:

NSString *myText = @"mary had a little lamb";
NSString *regexString = @"mary(.*?)little";

for(NSString *match in [myText componentsMatchedByRegex:regexString capture:1L]) {
  NSLog(@"%@",match);
}

Выше будет напечатано только " had a ",

Другие вопросы по тегам