[英]Get the unique characters in an 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]);
我修改了方法以從另一個stackoverflow問題進行打印:
- (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;
}
首先,您必須謹慎考慮字符。 在談論Unicode指的是UTF-16代碼單元時, NSString
的API使用字符一詞,但是孤立地處理代碼單元不會給您用戶認為的字符。 例如,存在與上一個字符組成的組合字符以產生不同的字形。 此外,還有代理對,只有在配對時才有意義。
結果,您實際上將需要收集包含用戶認為是字符的子字符串。
我正要編寫與Grzegorz Krukowski的答案非常相似的代碼。 他擊敗了我,所以我不會,但是我要補充一點,由於我上面提到的原因,您用於過濾合法字符的代碼已損壞。 例如,如果文本包含“é”並且將其分解為“ e”加上一個合並的重音符號,則您的代碼將去除“ e”,從而留下一個懸垂的合並的重音符號。 我相信您的意圖是將“é”視為非法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.