47

私は小さなiphoneプロジェクトに取り組んでおり、入力したuserNameに英数字のみが含まれているかどうかを確認する必要がありますか?(A-Z, a-z, 0-9。どうすれば確認できますか?

4

8 に答える 8

86

この1つのタスクのために正規表現ライブラリを持ち込みたくない場合...

NSString *str = @"aA09";
NSCharacterSet *alphaSet = [NSCharacterSet alphanumericCharacterSet];
BOOL valid = [[str stringByTrimmingCharactersInSet:alphaSet] isEqualToString:@""]; 
于 2009-11-04T04:29:26.077 に答える
61

これは機能します:

@implementation NSString (alphaOnly)

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

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

@end
于 2009-11-04T08:02:14.773 に答える
9

この正規表現ライブラリはObjectiveCに使用できます。一致させるには、次の正規表現を使用します。

^[a-zA-Z0-9]*$
于 2009-11-04T04:04:13.087 に答える
9

ベースのNSCharacterSet回答では、日本語などのテキストに期待できる結果が得られず、英数字が含まれていると主張することがよくあります。実行されるテストは、「文字または数字のみが存在する」に要約され、日本語(など)の文字は「」としてカウントされます。手紙'。

ラテン文字と外国語(日本語など)を比較する場合は、「NSStringがラテンベースかどうかを判断する方法」の回答が役立つ場合があります。

BOOL isLatin = [myString canBeConvertedToEncoding:NSISOLatin1StringEncoding];

NSASCIIStringEncodingNSISOLatin1StringEncodingの代わりに使用して、有効な文字をさらに制限することもできます。後でNSCharacterSetを使用してテストし、!、#などの特殊文字を除外することもできます。

于 2012-07-23T21:09:38.387 に答える
5

私はかなり広範なパフォーマンステストを実行しましたが、英数字の文字列を検証する方法を選択する際に考慮すべきいくつかの考慮事項があります。まず、もちろん、パフォーマンスについても気にしないかもしれないということです。アプリが文字列を検証することはめったにない場合、またはおそらく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関数のテストは行いませんでした。

于 2014-10-27T20:16:10.363 に答える
3
- (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カテゴリにコピー/貼り付けできます

于 2014-04-26T23:45:53.213 に答える
2

私は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
于 2009-11-04T16:46:06.330 に答える
1

NSStringiOS3.2で導入された正規表現機能を使用できます。

- (BOOL)isAlphanumeric:(NSString *)string {
    return [string rangeOfString:@"^[a-zA-Z0-9]+$" options:NSRegularExpressionSearch].location != NSNotFound;
}
于 2016-03-14T17:08:11.803 に答える