Cocoa анализирует строку данных как регулярное выражение perl

#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 .