0

每次我都会从我的服务器上得到一个字符串:

"&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");。正如我所说,有时我会收到一半的消息。谁能告诉我哪里出错了?

4

1 回答 1

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。

希望这能满足您的需要。

于 2013-04-17T14:47:34.350 回答