Frage

Ich arbeite an einem kleinen iPhone-Projekt, und ich würde, wenn der Benutzername überprüfen muß eingegeben nur alphanumerische Zeichen enthält? (A-Z, a-z, 0-9. Wie würde ich mich über sie überprüfen?

War es hilfreich?

Lösung

Wenn Sie nicht möchten, dass für diese eine Aufgabe in einer regex Bibliothek bringen ...

NSString *str = @"aA09";
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
BOOL valid = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 

Andere Tipps

Dies funktioniert:

@implementation NSString (alphaOnly)

- (BOOL) isAlphaNumeric
{
    NSCharacterSet *unwantedCharacters = 
       [[NSCharacterSet alphanumericCharacterSet] invertedSet];

    return ([self rangeOfCharacterFromSet:unwantedCharacters].location == NSNotFound);
}

@end

Sie können mit dieser Bibliothek für reguläre Ausdrücke für ObjectiveC. Verwenden Sie den folgenden regulären Ausdruck übereinstimmen:

^[a-zA-Z0-9]*$

Die NSCharacterSet basierte Antworten nicht die Ergebnisse, die Sie für japanische etc Text erwarten, oft behaupten, dass sie alphanumerische Zeichen enthalten tun - der Test durchgeführt wird, läuft darauf hinaus, ‚gibt es nur Buchstaben oder Zahlen‘ und Japanisch (usw.) Zeichen gelten als 'Letters'.

Wenn Sie versuchen, gegen eine Fremdsprache lateinische Zeichen zu überprüfen (z. B. Japanisch), dann die Antwort von „ Wie bestimmen, ob ein NSString Based lateinisch ist ?" kann helfen:

BOOL isLatin = [myString canBeConvertedToEncoding:NSISOLatin1StringEncoding];

NSASCIIStringEncoding könnte auch statt NSISOLatin1StringEncoding verwendet werden, um die gültigen Zeichen zu beschränken. Sie können auch im Nachhinein mit NSCharacterSet testen, Sonderzeichen wie! Auszuschließen, #, etc.

Ich habe einige ziemlich umfangreiche Performance-Tests laufen und es gibt mehrere Überlegungen zu berücksichtigen bei der Auswahl, wie Sie Ihre alphanumerische Zeichenfolgen zu validieren. Erstens ist natürlich, dass Sie nicht einmal über die Leistung kümmern kann. Wenn Ihre App selten Strings validiert, oder vielleicht sogar nur, dass es einmal, was Methode, die Ihnen das Verhalten gibt mögen Sie ist in Ordnung. Darüber hinaus sind hier meine Leistungsergebnisse.

Für benutzerdefinierte Zeichensätze (alphanumerische Zeichen sagen, ohne Unicode-Zeichen oder Zeichen), ist dies am schnellsten für einen ersten Durchlauf:

NSCharacterSet *alphanumericSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"];
NSString *result = [self stringByTrimmingCharactersInSet:alphanumericSet];

return [result isEqualToString:@""];

Wenn Sie in Ordnung eines vorberechneten Charakter wie [NSCharacterSet alphanumericCharacterSet] gesetzt verwenden, dann war dies am schnellsten:

NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
alphanumericSet = alphanumericSet.invertedSet;
NSRange range = [self rangeOfCharacterFromSet:alphanumericSet];

return (range.location == NSNotFound);

Caching den Zeichensatz in einer statischen Variablen dispatch_once verwendet, kann ziemlich viel helfen, wenn Sie diese Validierungen wiederholt ausgeführt werden. In diesem Fall, wenn Sie sicher sind, können Sie die anfängliche Kompilierung unter Verwendung einer regex absorbieren dreht tatsächlich heraus die schnellste für benutzerdefinierte Zeichensätze sein:

static NSRegularExpression *alphanumericRegex;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    alphanumericRegex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z0-9]*$" options:NSRegularExpressionCaseInsensitive error:nil];
});
NSUInteger numberOfMatches = [alphanumericRegex numberOfMatchesInString:self options:0 range:NSMakeRange(0, self.length)];

return (numberOfMatches == 1);

Wenn Sie die Regex nicht verwenden möchten, die benutzerdefinierte Set-Version des zwischengespeicherten rangeOfCharacterFromSet Kanten aus den zwischengespeicherten stringByTrimmingCharactersInCharacterSet: Methode:

static NSCharacterSet *alphanumericSet;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    alphanumericSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"];
    alphanumericSet = alphanumericSet.invertedSet;
});

NSRange range = [self rangeOfCharacterFromSet:alphanumericSet];

return (range.location == NSNotFound);

Für vorberechneten Sätze, die im Cache gespeicherten rangeOfCharacterFromSet: Methode war erneut die schnellste:

static NSCharacterSet *alphanumericSet;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
    alphanumericSet = alphanumericSet.invertedSet;
});

NSRange range = [self rangeOfCharacterFromSet:alphanumericSet];

return (range.location == NSNotFound);

Und für jede Information war die isSupersetOfSet: Methode der langsamste, ob im Cache gespeichert ist oder nicht. Sieht aus wie isSupersetOfSet: ziemlich langsam ist.

NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:self];
NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];

return [alphanumericSet isSupersetOfSet:stringSet];

Ich habe nicht jede Prüfung der zugrunde liegenden CFCharacterSet Funktionen.

- (BOOL)isAlphaNumeric
{
     NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'. "];
     s = [s invertedSet];
     NSRange r = [self rangeOfCharacterFromSet:s];
     if (r.location == NSNotFound) {
         return NO;
     } else {
       return YES;
    }
}

Hat die Flexibilität zu addieren / subtrahieren neue Zeichen wie Leerzeichen

P. S Diese Methode kann Kopieren / Einfügen in NSString Kategorie sein

Ich mag die RegexKit Lite Framework. Es verwendet die ICU regex-Bibliothek, die bereits mit OSX enthalten und Unicode-Safe ausgestattet.

NSString *str = @"testString";
[str isMatchedByRegex:@"^[a-zA-Z0-9]*$"]; // strict ASCII-match
[str isMatchedByRegex:@"^[\p{L}\p{N}]*$"]; // unicode letters and numbers match

Sie können NSString reguläre Ausdruck Fähigkeiten nutzen, eingeführt in iOS 3.2:

- (BOOL)isAlphanumeric:(NSString *)string {
    return [string rangeOfString:@"^[a-zA-Z0-9]+$" options:NSRegularExpressionSearch].location != NSNotFound;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top