2013-05-10 4 views
1

Мне нужно разобрать строку, такую ​​как [abc]000, и я хочу получить массив, содержащий abc и 000. Есть ли простой способ сделать это?Как разбирать строковый формат, например [***] ***?

Я использую такой код:

NSString *sampleString = @"[abc]000"; 
NSArray *sampleParts = [sampleString componentsSeparatedByString:@"]"]; 
NSString *firstPart = [[[sampleParts objectAtIndex:0] componentsSeparatedByString:@"["] lastObject]; 
NSString *lastPart = [sampleParts lastObject]; 

Но это неэффективно и не проверить, является ли строка в формате, как [**] **.

+3

['NSRegularExpression'] (http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html) – millimoose

+2

[NSScanner] (https://developer.apple .com/ДОКУМЕНТАЦИЯ/Какао/Справочник/Фонд/Классы/NSScanner_Class/Reference/Reference.html) – vikingosegundo

+0

Помог ли вам любой из наших ответов? – lnafziger

ответ

1

Для этой простой модели, можно просто разобрать себя люблю:

NSString *s = @"[abc]000"; 
NSString *firstPart = nil; 
NSString *lastPart = nil; 
if ([s characterAtIndex: 0] == '[') { 
    NSUInteger i = [s rangeOfString:@"]"].location; 
    if (i != NSNotFound) { 
     firstPart = [s substringWithRange:NSMakeRange(1, i - 1)]; 
     lastPart = [s substringFromIndex:i + 1]; 
    } 
} 

Или вы могли бы научиться использовать класс NSScanner.

0

попробовать, как это,

NSString *sampleString = @"[abc]000"; 
NSString *pNRegex = @"\\[[a-z]{3}\\][0-9]{3}"; 
NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex]; 
BOOL check=[PNTest evaluateWithObject:sampleString ]; 
NSLog(@"success:%i",check); 

если success приходит как 1, то вы можете выполнить действие для разделения строки в массив.

1

Как всегда, есть много способов сделать это.

ВАРИАНТ 1
Если эти фиксированные строки длины (каждая часть всегда три символа), то вы можете просто получить подстроки непосредственно:

NSString *sampleString = @"[abc]000"; 
NSString *left = [sampleString substringWithRange:NSMakeRange(1, 3)]; 
NSString *right = [sampleString substringWithRange:NSMakeRange(5, 3)]; 
NSArray *parts = @[ left, right ]; 
NSLog(@"%@", parts); 

ВАРИАНТ 1 (укороченный)

NSArray *parts = @[ [sampleString substringWithRange:NSMakeRange(1, 3)], 
        [sampleString substringWithRange:NSMakeRange(5, 3)] ]; 
NSLog(@"%@", parts); 

ОПЦИЯ 2
Если они не всегда три символа, то вы можете использовать NSScanner:

NSString *sampleString = @"[abc]000"; 

NSScanner *scanner = [NSScanner scannerWithString:sampleString]; 

// Skip the first character if we know that it will always start with the '['. 
// If we can not make this assumption, then we would scan for the bracket instead. 
scanner.scanLocation = 1; 

NSString *left, *right; 

// Save the characters until the right bracket into a string which we store in left. 
[scanner scanUpToString:@"]" intoString:&left]; 

// Skip the right bracket 
scanner.scanLocation++; 

// Scan to the end (You can use any string for the scanUpToString that doesn't actually exist... 
[scanner scanUpToString:@"\0" intoString:&right]; 

NSArray *parts = @[ left, right ]; 
NSLog(@"%@", parts); 

РЕЗУЛЬТАТЫ (для всех вариантов)

2013-05-10 00:25:02.031 Testing App[41906:11f03] (
    abc, 
    000 
) 

ПРИМЕЧАНИЕ
Все эти предполагать хорошо сформированные строки, поэтому вы должны включить свою собственную проверку ошибок.

Смежные вопросы