كيفية التحقق مما إذا كانت سلسلة تحتوي فقط على أحرف أبجدية رقمية في الهدف ج؟

StackOverflow https://stackoverflow.com/questions/1671605

سؤال

أنا أعمل على مشروع فون صغير وسأحتاج إلى التحقق مما إذا كان اسم المستخدم الذي تم إدخاله يحتوي فقط على أحرف أبجدية أبجدية؟ (A-Z, a-z, 0-9. وبعد كيف أذهب في التحقق من ذلك؟

هل كانت مفيدة؟

المحلول

إذا كنت لا ترغب في إحضار مكتبة Regex لهذه المهمة واحدة ...

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

يمكنك استخدام هذه مكتبة التعبير العادية بالنسبة Essesivec. استخدم Regex التالي لمطابقة:

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

ال NSCharacterSet الإجابات المستندة إلى لا تعطي النتائج التي قد تتوقعها لنصها اليابانية وما بعدها، وغالبا ما تدعي أنها تحتوي على أحرف أبجدية رقمية - يتم تغليه الاختبار إلى أسفل "هل هناك أحرف أو أرقام فقط"، والرقابة اليابانية (إلخ) ".

إذا كنت تحاول التحقق من الأحرف اللاتينية مقابل لغة أجنبية (على سبيل المثال. اليابانية)، ثم الجواب من " كيفية تحديد ما إذا كان nsstring مقره اللاتينية؟ " قد يساعد:

BOOL isLatin = [myString canBeConvertedToEncoding:NSISOLatin1StringEncoding];

NSASCIIStringEncoding يمكن أيضا استخدامها بدلا من nsisolatin1StringEncoding لمزيد من تقييد الأحرف الصحيحة. يمكنك أيضا اختبار استخدام Nscharacterset بعد ذلك، لاستبعاد أحرف خاصة مثل!، #، إلخ.

لقد قمت بتشغيل بعض اختبارات الأداء الواسعة إلى حد ما وهناك العديد من الاعتبارات التي يجب مراعاتها عند اختيار كيفية التحقق من صحة سلاسلك الأبجدية الرقمية. أولا، بالطبع، هو أنك قد لا تهتم بالأداء. إذا كان تطبيقك نادرا ما يتحقق من صحة السلاسل، أو ربما لا يفعل ذلك مرة واحدة فقط، فما الطريقة التي تمنحك السلوك الذي تريده على ما يرام. أبعد من ذلك، وهنا نتائج أداء بلدي.

للحصول على مجموعات الأحرف المخصصة (قل أحرف أبجدية رقمية، بدون أحرف أو علامات 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 يمكن أن تساعد قليلا إذا قمت بتشغيل هذه الرسائل مرارا وتكرارا. في هذه الحالة، إذا كنت متأكدا، يمكنك استيعاب وقت التجميع الأولي، باستخدام Regex يتضح بالفعل أن تكون أسرع مجموعات الأحرف المخصصة:

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);

إذا كنت لا ترغب في استخدام Regex، إصدار مجموعة مخصصة للتخزين المؤقت 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;
    }
}

لديه المرونة لإضافة / طرح أحرف جديدة مثل Whitespaces

ملاحظة: يمكن أن تكون هذه الطريقة نسخ / لصق في فئة NSSTRING

أنا حقا أحب regexkit قليل الدسم إطار العمل. يستخدم مكتبة ICU Regex، والتي تم تضمينها بالفعل مع OSX وهي آمنة Unicode.

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

يمكنك استخدام NSString قدرات تعبيرية منتظمة، قدمت في IOS 3.2:

- (BOOL)isAlphanumeric:(NSString *)string {
    return [string rangeOfString:@"^[a-zA-Z0-9]+$" options:NSRegularExpressionSearch].location != NSNotFound;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top