获取 NSString 中的唯一字符



如何在NSString中获取唯一字符?

我试图做的是获取NSString中的所有非法字符,以便我可以提示用户输入了哪些字符,因此需要删除。我首先定义一个法律字符NSCharacterSet,将它们与每次出现的法律字符分开,然后将剩下的(仅非法字符)加入一个新的NSString。我现在计划获取新NSString的独特字符(希望是作为数组),但我在任何地方都找不到参考。

NSCharacterSet *legalCharacterSet = [NSCharacterSet
    characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789-()&+:;,'.# "];
NSString *illegalCharactersInTitle = [[self.titleTextField.text.noWhitespace
    componentsSeparatedByCharactersInSet:legalCharacterSet]
    componentsJoinedByString:@""];

这应该对您有所帮助。我找不到任何现成的功能。

NSMutableSet *uniqueCharacters = [NSMutableSet set];
NSMutableString *uniqueString = [NSMutableString string];
[illegalCharactersInTitle enumerateSubstringsInRange:NSMakeRange(0, illegalCharactersInTitle.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    if (![uniqueCharacters containsObject:substring]) {
        [uniqueCharacters addObject:substring];
        [uniqueString appendString:substring];
    }
}];
尝试对

代码进行以下改编:

// legal set
NSCharacterSet *legalCharacterSet = [NSCharacterSet
                                         characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789-()&+:;,'.# "];
// test strings
NSString *myString = @"LegalStrin()";
//NSString *myString = @"francesco@gmail.com"; illegal string

NSMutableCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:myString];
// inverts the set
NSCharacterSet *illegalCharacterSet = [legalCharacterSet invertedSet];
// intersection of the string set and the illegal set that modifies the mutable stringset itself
[stringSet formIntersectionWithCharacterSet:illegalCharacterSet];
// prints out the illegal characters with the convenience method
NSLog(@"IllegalStringSet: %@", [self stringForCharacterSet:stringSet]);

我调整了该方法以从另一个堆栈溢出问题打印:

- (NSString*)stringForCharacterSet:(NSCharacterSet*)characterSet
{
    NSMutableString *toReturn = [@"" mutableCopy];
    unichar unicharBuffer[20];
    int index = 0;
    for (unichar uc = 0; uc < (0xFFFF); uc ++)
    {
        if ([characterSet characterIsMember:uc])
        {
            unicharBuffer[index] = uc;
            index ++;
            if (index == 20)
            {
                NSString * characters = [NSString stringWithCharacters:unicharBuffer length:index];
                [toReturn appendString:characters];
                index = 0;
            }
        }
    }
    if (index != 0)
    {
        NSString * characters = [NSString stringWithCharacters:unicharBuffer length:index];
        [toReturn appendString:characters];
    }
    return toReturn;
}

首先,你必须小心你认为的角色。NSString的 API 在讨论 Unicode 所指的 UTF-16 代码单元时使用字符一词,但单独处理代码单元不会为您提供用户认为的字符。例如,有一些组合字符与前一个字符组成以生成不同的字形。此外,还有代理对,只有在配对时才有意义。

因此,您实际上需要收集包含用户认为的字符的子字符串。

我即将编写与Grzegorz Krukowski的答案非常相似的代码。他打败了我,所以我不会,但我要补充一点,由于我上面引用的原因,你过滤掉合法字符的代码被破坏了。例如,如果文本包含"é",并且分解为"e"加上组合急性重音,则代码将去除"e",留下悬空的组合尖重音。我相信您的意图是将"é"视为非法。

最新更新