簡體   English   中英

獲取NSString中的唯一字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM