Цель C - RegexKitLite - Разбор внутреннего содержимого строки, то есть: начало (. *?) Конец - PullRequest
0 голосов
/ 10 июня 2010
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 ]

3 голосов
/ 10 июня 2010

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

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

NSString *match = [[myText captureComponentsMatchedByRegex:regexString] objectAtIndex:1]
1 голос
/ 10 июня 2010

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 ".

...