Ios 获取NSString中的唯一字符

Ios 获取NSString中的唯一字符,ios,iphone,objective-c,cocoa-touch,nsstring,Ios,Iphone,Objective C,Cocoa Touch,Nsstring,如何获取NSString中的唯一字符 我想做的是获取NSString中的所有非法字符,这样我就可以提示用户输入了哪些字符,因此需要删除这些字符。我首先定义一个合法字符的NSCharacterSet,将它们与合法字符的每次出现分开,并将剩下的(只有非法字符)加入一个新的NSString。我现在计划获取新的NSString(希望是作为数组)的唯一字符,但我在任何地方都找不到引用 NSCharacterSet *legalCharacterSet = [NSCharacterSet chara

如何获取
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];
    }
}];

那应该对你有帮助。我找不到任何现成的函数

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指数=0;
对于(unichar uc=0;uc<(0xFFFF);uc++)
{
if([字符集特征成员:uc])
{
unicharBuffer[index]=uc;
索引++;
如果(索引==20)
{
NSString*characters=[NSString stringWithCharacters:unicharBuffer长度:索引];
[toReturn appendString:个字符];
指数=0;
}
}
}
如果(索引!=0)
{
NSString*characters=[NSString stringWithCharacters:unicharBuffer长度:索引];
[toReturn appendString:个字符];
}
回归回归;
}

尝试对代码进行以下调整:

// 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指数=0;
对于(unichar uc=0;uc<(0xFFFF);uc++)
{
if([字符集特征成员:uc])
{
unicharBuffer[index]=uc;
索引++;
如果(索引==20)
{
NSString*characters=[NSString stringWithCharacters:unicharBuffer长度:索引];
[toReturn appendString:个字符];
指数=0;
}
}
}
如果(索引!=0)
{
NSString*characters=[NSString stringWithCharacters:unicharBuffer长度:索引];
[toReturn appendString:个字符];
}
回归回归;
}

<>代码>首先,你必须小心你所考虑的字符。当谈到Unicode所指的UTF-16代码单元时,
NSString
的API使用字符这个词,但是单独处理代码单元并不能给出用户所认为的字符。例如,可以组合与前一个字符组成的字符以生成不同的字形。此外,还有代理项对,只有在配对时才有意义

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


我正准备写一段与Grzegorz Krukowski的答案非常相似的代码。他打败了我,所以我不会,但我要补充的是,由于我上面提到的原因,你过滤掉合法字符的代码被破坏了。例如,如果文本包含“é”,并且它被分解为“e”加上一个组合急性重音,那么代码将去掉“e”,留下一个悬空的组合急性重音。我认为你的意图是把“E”当作非法的。

首先,你必须小心你所考虑的角色。当谈到Unicode所指的UTF-16代码单元时,
NSString
的API使用字符这个词,但是单独处理代码单元并不能给出用户所认为的字符。例如,可以组合与前一个字符组成的字符以生成不同的字形。此外,还有代理项对,只有在配对时才有意义

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


我正准备写一段与Grzegorz Krukowski的答案非常相似的代码。他打败了我,所以我不会,但我要补充的是,由于我上面提到的原因,你过滤掉合法字符的代码被破坏了。例如,如果文本包含“é”,并且它被分解为“e”加上一个组合急性重音,那么代码将去掉“e”,留下一个悬空的组合急性重音。我相信您的意图是将“é”视为非法字符。

为什么不对文本字段应用格式化程序,这样就不可能输入非法字符了。这将提供一个更有用的解决方案。大老板们希望我显示哪些非法字符被显示。我认为这真的很愚蠢,但我只是一个程序员。不把它们分开,而是用
nsattributed字符串
在原始文本中突出显示它们怎么样?只需从一个新的属性可变字符串开始,循环遍历所有字符,如果它们是非法的,则附加它们或用红色附加它们。为什么不对文本字段应用格式设置程序,这样就不可能输入非法字符。这将提供一个更有用的解决方案。大老板们希望我显示哪些非法字符被显示。我认为这真的很愚蠢,但我只是一个程序员。不把它们分开,而是用
nsattributed字符串
在原始文本中突出显示它们怎么样?只需从一个新的属性可变字符串开始,循环遍历所有字符,如果它们是非法的,则附加它们或用红色附加它们。
-EnumerateSubstringsRange:…
使用
NSStringEnumerationByComposedCharacterSequences
,但请参阅我的答案,以了解有关
非法字符插入方式的其他注意事项