2013-05-10 119 views
1

我需要解析一个字符串,如[abc]000,我想得到的是一个包含abc000的数组。有没有简单的方法来做到这一点?如何解析字符串格式,如[***] ***?

我用这样的代码:

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 2013-05-10 01:29:28

+2

[NSScanner](https://developer.apple .com/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSScanner_Class/Reference/Reference.html) – vikingosegundo 2013-05-10 01:51:15

+0

我们的答案是否有助于您? – lnafziger 2013-05-24 20:20:02

回答

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

一如既往,有很多方法可以做到这一点。

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

注意
所有这些假设以及形成字符串,所以你应该包括你自己的错误检查。