NSString находит, что символ разбился

Каждый раз я получаю строку с моего сервера как:

"123:342:431:234& 232:2344:433:434& 234:453:534:3445&"

но иногда я получаю

"234:453:534:3445& 123:342:431 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");. Как я уже сказал, иногда я получу половину сообщения. Может ли кто-нибудь сказать мне, где я ошибаюсь?


person Diaaaaan    schedule 17.04.2013    source источник


Ответы (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.

Надеюсь, это делает то, что вам нужно.

person davidf2281    schedule 17.04.2013
comment
спасибо за вашу информацию. отлично работает :) я сомневаюсь, что NSString* __block совпал; как я объявляю это как глобальную переменную, потому что, если я хочу использовать совпадающую строку снаружи. Я попытался объявить NSString *matched;. я получаю нулевую строку, потому что она не соответствует __block. - person Diaaaaan; 18.04.2013