簡體   English   中英

NSScanner搜索單詞可以找到單詞的一部分

[英]NSScanner searching for words finds parts of words

我正在使用NSScanner在大型NSString中查找單詞數組,然后使用html標簽突出顯示它們。 基本上我掃描到第一個單詞並在那一點插入標簽。 問題是NSScanner也在查找部分單詞。 例如:

如果我掃描@“test”,@“high”,@“try”,它將匹配許多單詞的部分。

測試測試更高的嘗試

有沒有一種好的方法來設置NSScanner只匹配整個單詞? 謝謝。

如果您的目標是iOS 4或更高版本,請查看-enumerateSubstringsInRange:options:usingBlock: ::

NSMutableString *string = [NSMutableString stringWithString:@"test this out testers! higher than high. try, trying, tryst."];
NSString *startTag = @"<b>";
NSString *endTag = @"</b>";
NSSet *wordsToMatch = [NSSet setWithObjects:@"test", @"high", @"try", nil];
[string enumerateSubstringsInRange:(NSRange){ .location = 0, .length = [string length] } options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    if ([wordsToMatch containsObject:substring]) {
        [string insertString:startTag atIndex:substringRange.location];
        [string insertString:endTag atIndex:substringRange.location + substringRange.length + startTag.length];
    }
}];

首先感謝Wevah使用enumerateSubstrings的解決方案,它肯定是一個正確的解決方案。 但是,它不如我解決方案所需的那樣高效。 我目前解決這個問題的方法是根據borrrden的建議使用正則表達式(很好的建議,謝謝)。 我在時間分析器工具中分析了所有三個解決方案。

這是我目前的實施。

-(NSString *)getHighlightedString: (NSString *)unhighlightedString: (NSArray *)termsToHighlight
{

  NSMutableString *newString = [[NSMutableString alloc] initWithString:unhighlightedString];
  NSString *startTag = @"<b><i>";
  NSString *endTag = @"</i></b>";

  NSMutableString *expression = [[NSMutableString alloc] init];
  for (int i =0; i < [termsToHighlight count]; i++) 
  {
       [expression appendString:@"\\b"];
       [expression appendString:[termsToHighlight objectAtIndex:i]];
       [expression appendString:@"\\b"];

       if ([termsToHighlight count] != i + 1)
       {
           [expression appendString:@"|"];
       }

   }
   NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];
   NSArray* results = [regex matchesInString:unhighlightedString options:0 range:NSMakeRange(0, [unhighlightedString length])];
   for (NSTextCheckingResult* result in [results reverseObjectEnumerator]) {

       [newString insertString:endTag atIndex:result.range.location+result.range.length];
       [newString insertString:startTag atIndex:result.range.location];
   }

   return newString;
}

以下是三種不同測試的性能:

  1. 我原來的NSScanner解決方案
    • 測試一= 14ms
    • 測試二= 14ms
    • 測試三= 22ms
  2. Wevah的解決方案
    • 測試一= 249ms
    • 測試二= 189ms
    • 測試三= 295ms
  3. 我上面的正則表達式解決方案
    • 測試一= 69ms
    • 測試2 = 34ms
    • 測試三= 26ms

所以你可以看到nsscanner很快,在這種情況下不夠准確。 我願意放棄使用正則表達式獲得的小性能,以獲得准確性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM