2014-07-15 4 views
1

나는이 문제를 며칠 동안 처리해 왔지만 해결 방법을 찾을 수 없습니다. 나는 많은 인용 부호를 포함하는 매우 긴 문자열을 가지고 있으며, 나는 그 문자열을 사용하여 굵게 표시 할 수 있도록 모든 문자열 (문자열의 범위)을 찾을 수 있기를 원한다.인용 부호 사이의 모든 문자열 범위를 찾는 방법

예 이것은 문자열 " quoted "텍스트가 있고"more quoted text "가 있습니다. 이 문자열을 다음과 같이 바꿀 수 있습니다. 이것은 문자열 ""이며 ""텍스트가 인용되어 있고 "더 이상" 따옴표로 묶인 텍스트입니다.

- (void)stringBetweenString:(NSString*)start andString:(NSString*)end inString:(NSMutableAttributedString *)text 
    { 
      NSRange startRange = [[text string] rangeOfString:start]; 
      if (startRange.location != NSNotFound) 
      { 
       NSRange targetRange; 
       targetRange.location = startRange.location + startRange.length; 
       targetRange.length = [text length] - targetRange.location; 
       NSRange endRange = [[text string] rangeOfString:end options:0 range:targetRange]; 
       if (endRange.location != NSNotFound) 
       { 
        targetRange.length = endRange.location - targetRange.location; 
       [text addAttribute:NSFontAttributeName value:[NSFont fontWithName:@"Helvetica-Bold" size:12.0] range:targetRange]; 
       } 
      } 
     } 
+0

NSRegularExpression에 대해 들었습니까? – matt

답변

1

텍스트가 너무 오래이 조금 느린 될 수 있지만 그것이 작동하는 경우 :

이것은 내가 지금까지 가지고 있지만 나머지 문자열을하지 않을 것입니다. Regex 솔루션 작업.

NSString *string = @"Example This is a string \"with quoted1\" text and there is \"some more1\" quoted text. I want to be able to turn this string into the following: This is a string \"with quoted2\" text and there is \"some more2\" quoted text."; 

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string attributes:nil]; 

int leftFromLeft = 0; 

while ([string rangeOfString:@"\""].location != NSNotFound) { 

    NSRange quoteLocationFirst = [string 
            rangeOfString:@"\"" 
            options:0 
            range:NSMakeRange(leftFromLeft, string.length - leftFromLeft) 
            ]; 

    leftFromLeft = quoteLocationFirst.location + quoteLocationFirst.length; 

    NSRange quoteLocationSecond = [string 
            rangeOfString:@"\"" 
            options:0 
            range:NSMakeRange(leftFromLeft, string.length - leftFromLeft) 
            ]; 

    NSRange quotedTextRange = NSMakeRange(
            quoteLocationFirst.location, 
            quoteLocationSecond.location - quoteLocationFirst.location + 1 
           ); 

    UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:30.0f]; 
    [attString addAttribute:NSFontAttributeName value:font range:quotedTextRange]; 

    NSLog(@"%@ \r\n\r\n", [string substringWithRange:quotedTextRange]); 

    leftFromLeft = quoteLocationSecond.location + quoteLocationSecond.length; 

    if ([string rangeOfString:@"\"" options:0 range:NSMakeRange(leftFromLeft, string.length - leftFromLeft)].location == NSNotFound) { 
     string = @""; 
    } 
} 

편집

정규식 솔루션/더 빨리 더 나은 것으로 보인다.

NSString *string = @"Example This is a string \"with quoted1\" text and there is \"some more1\" quoted text. I want to be able to turn this string into the following: This is a string \"with quoted2\" text and there is \"some more2\" quoted text. Example This is a string \"with quoted3\" text and there is \"some more3\" quoted text. I want to be able to turn this string into the following: This is a string \"with quoted4\" text and there is \"some more4\" quoted text."; 

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:string attributes:nil]; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\"([^\"]*)\"" options:NSRegularExpressionCaseInsensitive error:nil]; 

NSArray *arrayOfAllMatches = [regex matchesInString:string options:0 range:NSMakeRange(0, string.length)]; 

for (NSTextCheckingResult *match in arrayOfAllMatches) { 

    UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:30.0f]; 
    [attString addAttribute:NSFontAttributeName value:font range:match.range]; 

    //NSLog(@"%@", [string substringWithRange:match.range]); 
} 
+0

당신은 남자입니다! 정규식 덕분에 훨씬 더 많이 작동 했어! – RockPaperScissors