Сравнить символы из nsstring с различными наборами символов

Я хочу сравнить каждый символ в nsstring один за другим с различными nscharactersets и выполнять различные операции в соответствии с набором символов, которому он соответствует.

Я могу назначить каждый символ для подстроки для сравнения с помощью цикла for.

- (void) compareCharactersOfWord: (NSString *) word {

    for (int i = 0; i<[word length]; i++) {

        NSString *substring = [word substringWithRange:NSMakeRange(i,1)];


        //need to compare the substring to characterset here

    }
}

У меня также есть два набора символов

 setOne = [[NSCharacterSet characterSetWithCharactersInString:@"EAIONRTLSU"]invertedSet];

 setTwo = [[NSCharacterSet characterSetWithCharactersInString:@"DG"] invertedSet];

Я немного потерян в части сравнения. Я пробовал разные методы, такие как rangeOfCharacterFromSet, но получал ошибки. в псевдокоде мне нужно что-то вроде

if (setOne containsCharacterFrom substring) {

//do stuff here

} else if (setTwo containsCharacterFrom substring) {

//do other stuff here

}

2 ответа

Решение

Чтобы увидеть, есть ли ваша переменная substring в одном из ваших наборов, вы должны сделать:

if ([substring rangeOfCharacterFromSet:setOne].location != NSNotFound) {
    // substring is in setOne
} else if ([substring rangeOfCharacterFromSet:setTwo].location != NSNotFound) {
    // substring is in setTwo
}

Другим вариантом является работа с персонажами.

for (int i = 0; i<[word length]; i++) {
    unichar ch = [word characterAtIndex:i];

    if ([setOne characterIsMember:ch]) {
        // in setOne
    } else if ([setTwo characterIsMember:ch]) {
        // in setTwo
    }
}

Есть одно большое ограничение ко второму варианту. Он не работает с символами Unicode выше 0xFFFF.

Вам нужно извлечь каждый символ (unichar) из строки и использовать [NSCharacterSet characterIsMember:] чтобы определить, является ли это частью NSCharacterSet:

- (void) compareCharactersOfWord: (NSString *)word
{
    // These could be initialised globally to speed things up a little...
    NSCharacterSet *setOne = [[NSCharacterSet characterSetWithCharactersInString:@"EAIONRTLSU"] invertedSet];
    NSCharacterSet *setTwo = [[NSCharacterSet characterSetWithCharactersInString:@"DG"] invertedSet];

    for (NSUInteger index = 0; index < [word length]; index++)
    {
        unichar c = [word characterAtIndex:index];
        if ([setOne characterIsMember:c])
        {
            // c is a member of character set #1
        }
        else if ([setTwo characterIsMember:c])
        {
            // c is a member of character set #2
        }
        else
        {
            // c is a member of neither character set
        }
    }
}
Другие вопросы по тегам