Как определить, находятся ли определенные символы в конце строки NSString? - PullRequest
0 голосов
/ 06 апреля 2010

Предположим, у меня могут быть следующие строки:

"hey @john..."
"@john, hello"
"@john(hello)"

Я токенизирую строку, чтобы каждое слово было разделено пробелом:

[myString componentsSeparatedByString:@" "];

Мой массив токенов теперь содержит:

@john...
@john,
@john(hello)

Я проверяю знаки препинания следующим образом:

NSRange textRange = [words rangeOfString:@","];
if(textRange.location != NSNotFound){ } //do something

Для этих случаев. Как я могу убедиться, что только @john является токенизированным, сохраняя при этом последние символы:

...
,
(hello)

Примечание. Я хотел бы иметь возможность обрабатывать все регистры символов в конце строки. Выше приведены только 3 примера.

Ответы [ 3 ]

1 голос
/ 06 апреля 2010

См. NSString's -rangeOfString: options: range: ... задайте ему диапазон { [myString length] - [searchString length], [searchString length] } и посмотрите, равно ли расположение результирующего диапазона NSNotFound. См. Параметры NSStringCompareOptions в документации по чувствительности к регистру и т. Д.

0 голосов
/ 08 апреля 2010

Вы уверены, что CFStringTokenizer или его новый эквивалент какао только для снежного барса не подойдет лучше?

Расщепление только по пробелам оченьНаивный способ токенизировать, как вы уже нашли.CFStringTokenizer и enumerateSubstrings… намного умнее насчет настоящих лексических правил на человеческом языке.

0 голосов
/ 07 апреля 2010

Вы можете использовать NSScanner и NSCharacterSet для этого. NSScanner может сканировать строку до первого появления символа в наборе. Если вы получите +alphaNumericCharacterSet и затем наберете -invertedSet, вы получите набор всех не алфавитно-цифровых символов.

Возможно, это не суперэффективно, но будет работать:

NSArray* strings = [NSArray arrayWithObjects:
                    @"hey @john...",
                    @"@john, hello",
                    @"@john(hello)",
                    nil];

//get the characters we want to skip, which is everything except letters and numbers
NSCharacterSet* illegalChars = [[NSCharacterSet alphanumericCharacterSet] invertedSet];


for(NSString* currentString in strings)
{
    //this stores the tokens for the current string
    NSMutableArray* tokens = [NSMutableArray array];

    //split the string into unparsed tokens
    NSArray* split = [currentString componentsSeparatedByString:@" "];

    for(NSString* currentToken in split)
    {
        //we only want tokens that start with an @ symbol
        if([currentToken hasPrefix:@"@"])
        {
            NSString* token = nil;

            //start a scanner from the first character after the @ symbol
            NSScanner* scanner = [NSScanner scannerWithString:[currentToken substringFromIndex:1]];
            //keep scanning until we hit an illegal character
            [scanner scanUpToCharactersFromSet:illegalChars intoString:&token];

            //get the rest of the string
            NSString* suffix = [currentToken substringFromIndex:[scanner scanLocation] + 1];

            if(token)
            {
                //store the token in a dictionary
                NSDictionary* tokenDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                           [@"@" stringByAppendingString:token], @"token", //prepend the @ symbol that we skipped
                                           suffix, @"suffix",
                                           nil];
                [tokens addObject:tokenDict];
            }
        }
    }
    //output
    for(NSDictionary* dict in tokens)
    {
        NSLog(@"Found token: %@ additional characters: %@",[dict objectForKey:@"token"],[dict objectForKey:@"suffix"]);
    }
}
...