поиск строк между маркерами в target-c - PullRequest
0 голосов
/ 13 января 2012

У меня есть одна очень длинная строка.

В ней есть маркеры, а между этими маркерами есть текст.

пример:

<body>blah blah blah</body><body>another string</body>

В основном я хочу перебратьстрока и извлекать текст между маркерами.Кроме того, я хочу поместить каждую строку текста в отдельную строку.

Так что, в сущности, я бы получил:

string1:blah blah blah
string2:another string

Как мне это сделать?

Изменить - возможно, я не был ясен.в одной строке будет много разделителей одного и того же типа. поэтому входная строка может быть буквально:

<body>blah blah blah</body><body>another string</body><body>blah blah blah</body><body>another string</body><body>blah blah blah</body><body>another string</body><body>blah blah blah</body>

Ответы [ 3 ]

3 голосов
/ 13 января 2012

Если первый разделитель появляется в вашем тексте только один раз, вы можете использовать код:

NSArray *c1 = [text componentsSeparatedByString:@"<body>"];
if ([c1 count]<2) {
    // you don't have first delimiter
}
NSArray *c2 = [[c1 objectAtIndex:1] componentsSeparatedByString:@"</body>"];
if ([c2 count]<2) {
    // you don't have second delimiter
}
NSString *result = [c2 objectAtIndex:0];

Вы также можете использовать NSScanner:

NSScanner *scanner = [NSScanner scannerWithString:text];
if (![scanner scanUpToString:@"<body>" intoString:nil]) {
    // there is no opening tag
}
NSString *result = nil;
if (![scanner scanUpToString:@"</body>" intoString:&result]) {
    // there is no closing tag
}

Второй фрагмент кода выглядит лучше.

Если XML, который вы пытаетесь проанализировать, становится более сложным, может оказаться лучше использовать NSXMLParser. Но в таких простых примерах использование NSXMLParser слишком многословно.

0 голосов
/ 14 января 2012

Вы можете использовать NSRegularExpression , чтобы построить регулярное выражение для поиска совпадений текста. Было бы довольно просто, если бы все разделители были одинаковыми. Найдите все совпадения и создайте из них массив или новую строку:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<body>(.*)</body>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
0 голосов
/ 14 января 2012

Вы можете использовать componentsSeparatedByString и componentsJoinedByString

NSString * dataString = [[NSString alloc] init];
dataString = [[dataString componentsSeparatedByString:@"<body>"] componentsJoinedByString:@","];
dataString = [[dataString componentsSeparatedByString:@"</body>"] componentsJoinedByString:@""];

NSArray *data = [dataString componentsSeparatedByString:@","];

Тогда у вас будет массив строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...