2014-01-14 1 views
1

У меня возникла проблема с поиском нескольких групп подстрок, обозначенных парой ** символов, и их смещением. например, в этом 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; 

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

любые идеи?

+0

@rmaddy Неа, не боян. Я задал другой вопрос. я получил там ответ и применил его к новому коду. этот вопрос - другой вопрос. – 3254523

+0

Неужели вы устали использовать замену регулярных выражений в глобальном контексте? – sln

+0

Как это не то же самое? Оба спрашивают, как преобразовать значение с разделителем в атрибутную строку. – rmaddy

ответ

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"; 
} 
+0

спасибо! прекрасно работает. удивительное решение – 3254523