كيفية التحقق مما إذا كانت سلسلة تحتوي فقط على أحرف أبجدية رقمية في الهدف ج؟
-
13-09-2019 - |
سؤال
أنا أعمل على مشروع فون صغير وسأحتاج إلى التحقق مما إذا كان اسم المستخدم الذي تم إدخاله يحتوي فقط على أحرف أبجدية أبجدية؟ (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;
}