2013-04-17 36 views
0

每次我會從我的服務器得到一個字符串:的NSString找到符號得到了墜毀

「&abc; 123:342:431:234 & &xyz; 232:2344:433:434 & &pqr; 234:453: 534:3445 & 「

但有時我會得到

」 &pqr; 234:453:534:3445 & &abc; 123:342:431 &xyz; 232:2344:433:434 & 「

我要捨棄那些消息(不與端」 &「)例如:&abc;123:342:431。我試過但我不知道我在哪裏犯錯誤。

這裏是我的代碼:

- (BOOL)ashCheckandsemiclonCheck:(NSString *)string { 
    if([string rangeOfString:@"&abc"].location != NSNotFound) { 
     NSLog(@"is here"); 
     NSString *pattern = @"&abc[^&]+&"; 
     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern 
                       options:0 error:NULL]; 

     [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length]) 
          usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
           NSRange range = [result range]; 
           matched = [string substringWithRange:range]; 

           NSLog(@"%@", matched); 
          }]; 
     NSLog(@"filtered Message :%@", matched); 
     int times = [[matched componentsSeparatedByString:@"&"] count] - 1; 
     NSLog(@"counted times :%i", times); 

     if (times == 2) { 
      return TRUE; 
     } else { 
      return FALSE; 
     }  
    } else { 
     return FALSE; 
    } 
} 

我想,如果我有兩個&但在我的代碼,我得到錯誤NSLog(@"is here");調用這個說法。正如我所說,有時我會得到一半的信息。誰能告訴我我要去哪裏?

回答

1

如果我正確地閱讀你的問題,似乎你只需要通過檢查它開始並以'&'結束來測試消息字符串是否有效。我會做到這一點的方法是編寫這樣的事:

NSString* testMessage = @"&bfjhfbgfjhb&"; 
NSString* firstCharacter = [testMessage substringToIndex:1]; 
NSString* lastCharacter = [testMessage substringFromIndex:testMessage.length - 1]; 

if (([firstCharacter isEqualToString:@"&"]) && 
     [lastCharacter isEqualToString:@"&"]){ 

    //This is a valid message. Proceed. 

}else{ 

    //This is not a valid message. Discard. 

} 

更新

好,根據你的問題編輯/更新,我編輯你的代碼 - 特別是你的正則表達式的字符串 - - 做我想你想,這是檢查「& ABC ......」你的消息款開始,以「&」字符結尾:

-(BOOL) ashCheckandsemiclonCheck :(NSString *)string; 
{ 

    if([string rangeOfString:@"&abc"].location !=NSNotFound) 
    { 
     NSLog(@"is here"); 

     NSString *pattern = @"&abc[^&\\s]+[^\\s]"; 

     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern 
                      options:0 error:NULL]; 
     NSString* __block matched; 
     [regex enumerateMatchesInString:string options:0 range:NSMakeRange(0, [string length]) 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
          NSRange range = [result range]; 
          matched = [string substringWithRange:range]; 

          NSLog(@"Matched: %@", matched); 

         }]; 

     NSLog(@"filtered Message :%@", matched); 
     int times =[[matched componentsSeparatedByString:@"&"]count]-1; 
     NSLog(@"counted times :%i",times); 

     if(times ==2){ 
      return YES; 
     }else 
     { 
      return NO; 
     }  
    } 
    else 
    { 
     return NO; 
    } 
} 

也改變了你的BOOL返回到Objective-C標準YES和NO,而不是TRUE和FALSE。

希望能夠滿足您的需求。

+0

我已經更新了我的問題,對於沒有詳細問題 – Diaaaaan

+0

對不起,請使用'YES'和'NO'代替'TRUE'和'FALSE'; – HAS

+0

感謝您的信息。工作真的很棒:)我懷疑「NSString * __block匹配;」我如何聲明這是一個全局變量,因爲如果我想使用外部的「匹配」字符串。我試圖聲明「NSString *匹配;」。我得到空字符串,因爲它不匹配「__block匹配」。 – Diaaaaan