私は小さなiphoneプロジェクトに取り組んでおり、入力したuserNameに英数字のみが含まれているかどうかを確認する必要がありますか?(A-Z, a-z, 0-9
。どうすれば確認できますか?
8 に答える
この1つのタスクのために正規表現ライブラリを持ち込みたくない場合...
NSString *str = @"aA09";
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
BOOL valid = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""];
これは機能します:
@implementation NSString (alphaOnly)
- (BOOL) isAlphaNumeric
{
NSCharacterSet *unwantedCharacters =
[[NSCharacterSet alphanumericCharacterSet] invertedSet];
return ([self rangeOfCharacterFromSet:unwantedCharacters].location == NSNotFound);
}
@end
この正規表現ライブラリはObjectiveCに使用できます。一致させるには、次の正規表現を使用します。
^[a-zA-Z0-9]*$
ベースのNSCharacterSet
回答では、日本語などのテキストに期待できる結果が得られず、英数字が含まれていると主張することがよくあります。実行されるテストは、「文字または数字のみが存在する」に要約され、日本語(など)の文字は「」としてカウントされます。手紙'。
ラテン文字と外国語(日本語など)を比較する場合は、「NSStringがラテンベースかどうかを判断する方法」の回答が役立つ場合があります。
BOOL isLatin = [myString canBeConvertedToEncoding:NSISOLatin1StringEncoding];
NSASCIIStringEncoding
NSISOLatin1StringEncodingの代わりに使用して、有効な文字をさらに制限することもできます。後でNSCharacterSetを使用してテストし、!、#などの特殊文字を除外することもできます。
私はかなり広範なパフォーマンステストを実行しましたが、英数字の文字列を検証する方法を選択する際に考慮すべきいくつかの考慮事項があります。まず、もちろん、パフォーマンスについても気にしないかもしれないということです。アプリが文字列を検証することはめったにない場合、またはおそらく1回だけ検証する場合でも、必要な動作を提供する方法は問題ありません。それを超えて、これが私のパフォーマンス結果です。
カスタム文字セット(Unicode文字やマークのない英数字など)の場合、これは最初の実行で最速です。
NSCharacterSet *alphanumericSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"];
NSString *result = [self stringByTrimmingCharactersInSet:alphanumericSet];
return [result isEqualToString:@""];
次のような事前計算された文字セットを使用しても問題がない場合は[NSCharacterSet alphanumericCharacterSet]
、これが最速でした。
NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
alphanumericSet = alphanumericSet.invertedSet;
NSRange range = [self rangeOfCharacterFromSet:alphanumericSet];
return (range.location == NSNotFound);
を使用して静的変数に文字セットをキャッシュすると、dispatch_once
これらの検証を繰り返し実行する場合に非常に役立ちます。その場合、最初のコンパイル時間を吸収できると確信している場合は、正規表現を使用することが実際にはカスタム文字セットの最速であることがわかります。
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);
正規表現を使用したくない場合は、キャッシュされrangeOfCharacterFromSet
たエッジのカスタムセットバージョンがキャッシュされたstringByTrimmingCharactersInCharacterSet:
メソッドを出力します。
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);
事前に計算されたセットの場合、キャッシュされたrangeOfCharacterFromSet:
メソッドが再び最速でした。
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);
そして、すべての人の情報として、このisSupersetOfSet:
方法は、キャッシュされているかどうかに関係なく、最も低速でした。isSupersetOfSet:
かなり遅いようです。
NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:self];
NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
return [alphanumericSet isSupersetOfSet:stringSet];
基盤となるCFCharacterSet関数のテストは行いませんでした。
- (BOOL)isAlphaNumeric
{
NSCharacterSet *s = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'. "];
s = [s invertedSet];
NSRange r = [self rangeOfCharacterFromSet:s];
if (r.location == NSNotFound) {
return NO;
} else {
return YES;
}
}
空白などの新しい文字を追加/削除する柔軟性があります
PSこのメソッドは、NSStringカテゴリにコピー/貼り付けできます
私はRegexKitLiteFrameworkが 本当に好きです。すでにOSXに含まれており、Unicodeで安全なICU正規表現ライブラリを使用します。
NSString *str = @"testString";
[str isMatchedByRegex:@"^[a-zA-Z0-9]*$"]; // strict ASCII-match
[str isMatchedByRegex:@"^[\p{L}\p{N}]*$"]; // unicode letters and numbers match
NSString
iOS3.2で導入された正規表現機能を使用できます。
- (BOOL)isAlphanumeric:(NSString *)string {
return [string rangeOfString:@"^[a-zA-Z0-9]+$" options:NSRegularExpressionSearch].location != NSNotFound;
}