Сравнить символы из 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
}
}
}