как поймать несколько экземпляров, специально указанных ** символов ** в NSString, и выделить их жирным шрифтом между ними?

У меня возникла проблема с поиском нескольких групп подстрок, обозначенных парой символов **, и выделением их жирным шрифтом. например, в этом NSString:

The Fox has **ran** around the **corner**

следует читать: Лиса забежала за угол

вот мой код:

NSString *questionString = queryString;
NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:questionString];

NSRange range = [questionString rangeOfString:@"\\*{2}([^*]+)\\*{2}" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) {
    [mutableAttributedString setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:size]} range:range];
}

[[mutableAttributedString mutableString] replaceOccurrencesOfString:@"**" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, queryString.length)];

return mutableAttributedString;

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

Любые идеи?


person 3254523    schedule 14.01.2014    source источник
comment
@rmaddy нет, не обманщик. Я задал другой вопрос там. я действительно получил там ответ и применил его к новому коду. это другой вопрос   -  person 3254523    schedule 15.01.2014
comment
Вы устали запускать замену регулярных выражений в глобальном контексте?   -  person    schedule 15.01.2014
comment
Как это не то же самое? Оба спрашивают, как преобразовать значение с разделителями в атрибутированную строку.   -  person rmaddy    schedule 15.01.2014


Ответы (1)


Вы должны перечислить все совпадения регулярного выражения. Это немного сложно, потому что все диапазоны сдвигаются, когда вы удаляете ограничивающие пары «**».

Кажется, это делает работу:

NSString *questionString = @"The Fox has **ran** around the **corner**";
NSMutableAttributedString *mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:questionString];

NSError *error = nil;
NSString *pattern = @"(\\*{2})([^*]+)(\\*{2})";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];

__block NSUInteger shift = 0; // number of characters removed so far
[regex enumerateMatchesInString:questionString options:0 range:NSMakeRange(0, [questionString length])
     usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
         NSRange r1 = [result rangeAtIndex:1]; // location of first **
         NSRange r2 = [result rangeAtIndex:2]; // location of word in between
         NSRange r3 = [result rangeAtIndex:3]; // location of second **
         // Adjust locations according to the string modifications:
         r1.location -= shift;
         r2.location -= shift;
         r3.location -= shift;
         // Set attribute for the word:
         [mutableAttributedString setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:12.0]} range:r2];
         // Remove the **'s:
         [[mutableAttributedString mutableString] deleteCharactersInRange:r3];
         [[mutableAttributedString mutableString] deleteCharactersInRange:r1];
         // Update offset:
         shift += r1.length + r3.length;
     }];

Результат (в консоли отладчика):

The Fox has {
}ran{
    NSFont = "<UICTFont: 0xc03efb0> font-family: \".HelveticaNeueInterface-MediumP4\"; font-weight: bold; font-style: normal; font-size: 12.00pt";
} around the {
}corner{
    NSFont = "<UICTFont: 0xc03efb0> font-family: \".HelveticaNeueInterface-MediumP4\"; font-weight: bold; font-style: normal; font-size: 12.00pt";
}
person Martin R    schedule 14.01.2014
comment
Спасибо! работает отлично. отличное решение - person 3254523; 15.01.2014