Pracuję nad małym projektem iphone i muszę sprawdzić, czy wprowadzona nazwa użytkownika zawiera tylko znaki alfanumeryczne? (A-Z, a-z, 0-9
. Jak mam to sprawdzić?Jak sprawdzić, czy ciąg zawiera tylko znaki alfanumeryczne w obiektywnym C?
Odpowiedz
Jeśli nie chcesz wnieść w regex biblioteki dla tego jednego zadania ...
NSString *str = @"aA09";
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
BOOL valid = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];
Możesz użyć this regular expression library dla ObjectiveC. Użyj następującego wyrażenia regularnego, aby dopasować:
^[a-zA-Z0-9]*$
to będzie działać:
@implementation NSString (alphaOnly)
- (BOOL) isAlphaNumeric
{
NSCharacterSet *unwantedCharacters =
[[NSCharacterSet alphanumericCharacterSet] invertedSet];
return ([self rangeOfCharacterFromSet:unwantedCharacters].location == NSNotFound);
}
@end
'? TAK: NIE "nie jest naprawdę konieczne. Wynik porównania logicznego jest już wartością logiczną. – Chuck
Wiem, po prostu lubię to widzieć, więc nie czytam tego później i myślę, że coś zostawiłem. – NSResponder
Hej, to miłe, zbyt człowiek, nie wiedziałem, że możesz odwrócić zestaw znaków. Zastanawiam się, jak to działa dla innych języków, takich jak chiński –
Bardzo podoba mi się szkielet RegexKitLite. Używa biblioteki regex ICU, która jest już dołączona do OSX i jest bezpieczna dla Unicode.
NSString *str = @"testString";
[str isMatchedByRegex:@"^[a-zA-Z0-9]*$"]; // strict ASCII-match
[str isMatchedByRegex:@"^[\p{L}\p{N}]*$"]; // unicode letters and numbers match
NSCharacterSet
odpowiedzi opartej na nie dają rezultatów można się spodziewać tekstu japońskiego itp, często twierdząc, że robią zawierać znaki alfanumeryczne - badanie jest wykonywane sprowadza się do „tam są tylko litery lub cyfry” i Japońskie znaki (itp.) Liczą się jako "Listy". (Np. Japoński)
Jeśli starasz się, by sprawdzić znaki łacińskie vs języku obcym, to odpowiedź od „How to determine if an NSString is latin based?” może pomóc:
BOOL isLatin = [myString canBeConvertedToEncoding:NSISOLatin1StringEncoding];
NSASCIIStringEncoding
może być również stosowany zamiast NSISOLatin1StringEncoding dalszego ogranicz ważne znaki. Można również sprawdzić za pomocą NSCharacterSet potem wykluczyć znaki specjalne jak!, #, itp
Znaki specjalne, takie jak "#", " @ ', itp. można również konwertować na kodowanie łacińskie, więc ta metoda działa tylko w przypadku łacińskiego vs. –
- (BOOL)isAlphaNumeric
{
NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'. "];
s = [s invertedSet];
NSRange r = [self rangeOfCharacterFromSet:s];
if (r.location == NSNotFound) {
return NO;
} else {
return YES;
}
}
ma możliwość dodawania/odejmij nowe postacie jak whitespaces
PS Ta metoda może być kopiuj/wklej w NSString kategoria
Myślę, że możesz zmienić ostatni fragment kodu na 'return r.location == NSNotFound;' – agmezr
Przeprowadziłem dość obszerne testy wydajności i należy wziąć pod uwagę kilka kwestii przy wyborze sposobu sprawdzania łańcuchów alfanumerycznych. Po pierwsze, oczywiście nie musisz przejmować się wydajnością. Jeśli twoja aplikacja rzadko sprawdza poprawność łańcuchów, a może robi to tylko raz, to jakakolwiek metoda, która daje ci pożądane zachowanie, jest w porządku. Poza tym, oto moje wyniki wydajności.
Dla własnych zestawów znaków (słownie znaków alfanumerycznych, bez znaków Unicode lub znaków), jest to najszybszy na początkowy biegu:
NSCharacterSet *alphanumericSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"];
NSString *result = [self stringByTrimmingCharactersInSet:alphanumericSet];
return [result isEqualToString:@""];
Jeśli jesteś w porządku przy użyciu zestawu znaków precomputed jak [NSCharacterSet alphanumericCharacterSet]
wtedy to było najszybciej:
NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
alphanumericSet = alphanumericSet.invertedSet;
NSRange range = [self rangeOfCharacterFromSet:alphanumericSet];
return (range.location == NSNotFound);
Buforowanie zestaw znaków w zmiennej statycznej przy użyciu dispatch_once
może pomóc trochę jeśli uruchomić te walidacji wielokrotnie.W takim przypadku, jeśli jesteś pewien, można wchłonąć początkowy czas kompilacji przy użyciu regex w rzeczywistości okazuje się być najszybszy na niestandardowe zestawy znaków:
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);
Jeśli nie chcesz korzystać z regex, zwyczaj zestaw wersję pamięci podręcznej rangeOfCharacterFromSet
krawędzie się w pamięci podręcznej stringByTrimmingCharactersInCharacterSet:
metody:
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);
Dla precomputed zestawach pamięci podręcznej rangeOfCharacterFromSet:
metoda była ponownie najszybszy:
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);
I dla wszystkich informacji, metoda isSupersetOfSet:
była najwolniejsza, zarówno buforowana, jak i nie. Wygląda na to, że isSupersetOfSet:
jest dość powolny.
NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:self];
NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
return [alphanumericSet isSupersetOfSet:stringSet];
Nie wykonałem żadnych testów podstawowych funkcji CFCharacterSet.
Świetna odpowiedź. Wiele małych seriali z [NSCharacterSet alfanumericCharacterSet]. Proste i nieeleganckie "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" było dokładnie tym, czego potrzebowałem, aby uniknąć chińskich/japońskich znaków w wykryciu alfanumerycznym. – JeremyDay
Można użyć NSString
regularne możliwości ekspresyjnych, wprowadzone w iOS 3.2:
- (BOOL)isAlphanumeric:(NSString *)string {
return [string rangeOfString:@"^[a-zA-Z0-9]+$" options:NSRegularExpressionSearch].location != NSNotFound;
}
- 1. Jak sprawdzić, czy ciąg zawiera tylko znaki alfanumeryczne i myślniki?
- 2. Jak sprawdzić, czy ciąg zawiera tylko cyfry/znaki numeryczne?
- 3. Sprawdź, czy ciąg zawiera tylko znaki ASCII?
- 4. Jak mogę sprawdzić, czy ciąg zawiera znaki wielobajtowe w JavaScript?
- 5. Jak mogę sprawdzić, czy ciąg zawiera tylko litery?
- 6. Jak mogę sprawdzić, czy ciąg zawiera tylko litery w Pythonie?
- 7. Sprawdź, czy ciąg zawiera znaki spoza cyfr
- 8. Jak sprawdzić w JavaScript że ciąg zawiera znaki alfabetu
- 9. W języku C#, jak sprawdzić, czy ciąg zawiera liczbę całkowitą?
- 10. Jak sprawdzić, czy ciąg zawiera część innego ciągu w C#?
- 11. Jak mogę sprawdzić, czy ciąg znaków zawiera znaki i spacje, a nie tylko białe spacje?
- 12. SELECT tylko wiersze, które zawierają tylko znaki alfanumeryczne w MySQL
- 13. Jak sprawdzić, czy ciąg zawiera znaki inne niż określone. (w Javie)
- 14. ciąg zawiera tylko alfabety
- 15. Jak sprawdzić, czy tekst zawiera tylko liczby?
- 16. Sprawdź, czy ciąg zawiera wszystkie znaki innego ciągu w Ruby
- 17. sprawdzić, czy ciąg zawiera numer większy niż
- 18. Sprawdź, czy ciąg zawiera tylko zestaw liter
- 19. Zezwalaj tylko na znaki alfanumeryczne w polu tekstowym
- 20. Jak ustalić, czy ciąg ma niealfanumeryczne znaki?
- 21. Aby sprawdzić, czy ciąg zawiera określone słowo
- 22. Jak sprawdzić ciąg zawiera tylko cyfry i miejsca dziesiętne?
- 23. sprawdzić, ile razy ciąg zawiera znak „g” w kwalifikujących ciąg
- 24. Jak sprawdzić, czy ciąg zawiera litery angielskie (A-Z)?
- 25. Jak mogę sprawdzić, czy ciąg zawiera litery w Swift?
- 26. Ruby - Jak sprawdzić, czy ciąg zawiera wszystkie słowa w tablicy?
- 27. Jak mogę sprawdzić, czy ciąg zawiera chiński w Swift?
- 28. Jak sprawdzić, czy tablica znaków zawiera jeden ciąg w JavaScript?
- 29. Jak sprawdzić, czy tablica zawiera ciąg znaków w maszynopisie?
- 30. jak sprawdzić, czy lista zawiera tylko None w python
w Swift: http://stackoverflow.com/questions/35992800/check-if-a-string-is-alphanumeric- in-swift – ma11hew28