#cocoa #parsing
#cocoa #синтаксический анализ
Вопрос:
Какой наиболее эффективный способ проанализировать строку данных, аналогичную тому, как это делает perl regex? Например, если строка данных: «имя пользователя!ABCD!123-123-0000», я мог бы использовать это выражение perl для анализа данных: data =~ /([A-z] )!([A-F] )!([0-9] )-(. )/
Это вызывает $1=username, $2=ABCD, $3=123, $4=123-0000
Есть ли способ сделать это в Cocoa? Даже решения, которые предопределяют 4 переменные NSString, подходят.
Ответ №1:
Рассмотрим следующий шаблон:
username!tag!password
И следующие требования:
- Имя пользователя может содержать только
A-Z
иa-z
. - Тег может содержать только
A-F
. - Пароль может содержать только
0-9
и-
.
Один из методов извлечения и проверки значений:
NSString *input = @"username!ABCD!123-123-0000";
NSArray *split = [input componentsSeparatedByString:@"!"];
NSString *user = [split objectAtIndex:0];
NSString *tag = [split objectAtIndex:1];
NSString *pass = [split objectAtIndex:2];
NSCharacterSet *checkUser = [NSCharacterSet letterCharacterSet];
NSCharacterSet *checkTag = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEF"];
NSCharacterSet *checkPass = [NSCharacterSet characterSetWithCharactersInString:@"0123456789-"];
if ( [[user stringByTrimmingCharactersInSet:checkUser] length] == 0 ) NSLog(@"User "%@" is valid.",user);
if ( [[tag stringByTrimmingCharactersInSet:checkTag ] length] == 0 ) NSLog(@"Tag "%@" is valid.", tag );
if ( [[pass stringByTrimmingCharactersInSet:checkPass] length] == 0 ) NSLog(@"Pass "%@" is valid.",pass);
Вывод:
User "username" is valid.
Tag "ABCD" is valid.
Pass "123-123-0000" is valid.
Вы также можете рассмотреть возможность использования NSScanner
или NSRegularExpression
.