2013-04-15 42 views
0

我有一个字符串像ConsumerVisit(201)或日期(CX1)。我怎样才能得到括号内的字符串“(”“)”?如何获得括号之间的子字符串

我试了几次用下面的代码,但它在substringWithRange坠毁..

NSRange match; 
    NSRange match1; 
    match = [_actType.text rangeOfString: @"("]; 
    match1 = [_actType.text rangeOfString: @")"]; 
    NSLog(@"%i,%i",match.location,match1.location); 
    NSString *newDes = [_actType.text substringWithRange: NSMakeRange (match.location, match1.location-1)]; 
+1

发生崩溃是因为您使用的NSMakeRange参数错误。第一秒应该是范围的长度,而不是其结束的位置。你的代码中的最后一行应该是这样的:'NSString * newDes = [_actType substringWithRange:NSMakeRange(match.location + 1,match1.location - match.location - 1)];' – filwag

回答

1

尝试波纹管代码..

NSString *newDes = _actType.text; 
NSArray *strArray = [newDes componentsSeparatedByString:@"("]; 
newDes = [strArray objectAtIndex:1]; 
strArray = [newDes componentsSeparatedByString:@")"]; 
newDes = [strArray objectAtIndex:0]; 

newDes的值应该是 ..

我用你的价值像波纹管..

NSString *newDes = @"ConsumerVisit(201)"; 
NSArray *strArray = [newDes componentsSeparatedByString:@"("]; 
newDes = [strArray objectAtIndex:1]; 
strArray = [newDes componentsSeparatedByString:@")"]; 
newDes = [strArray objectAtIndex:0]; 
NSLog(@"\n\n newDes ==>> %@",newDes); 

,走出看跌期权newDes == >> 201

+2

它运行良好,但分配数组,如果您正在处理成千上万的数据,可能会造成危害。范围的解决方案更有效率,记忆方面。 – Cyrille

+0

是的,你是对的第一我认为相同,但在我读了阙,在这里ibiren定义ConsumerVisit(201)或日期(CX1),所以我把这个简单的例子,所以他很容易理解.. BTW thanx @Cyrille :) –

1

利用下面的代码中,

NSString *subString = nil; 
NSString * myString = @" hello(1234)"; 
NSRange range1 = [myString rangeOfString:@"("]; 
NSRange range2 = [myString rangeOfString:@")"]; 

if ((range1.length == 1) && (range2.length == 1) && (range2.location > range1.location)) 
{ 
    NSRange range3; 
    range3.location = range1.location+1; 
    range3.length = (range2.location - range1.location)-1; 

    subString = [myString substringWithRange:range3]; 
} 
NSLog(@"%@",subString); 

输出=====> 1234

1

如果您觉得足够冒险,您可以使用正则表达式,它们实际上是为此目的而创建的。不过,他们确实需要一点习惯。

NSString *text = @"ConsumerVisit(201)"; 
NSString *substring = nil; 

NSRange parenRng = [text rangeOfString: @"(?<=\\().*?(?=\\))" options: NSRegularExpressionSearch]; 

if (parenRng.location != NSNotFound) { 
    substring = [text substringWithRange:parenRng]; 
} 

模式打破了这样的:

  1. 搜索一个括号,这是在可可正则表达式
  2. “拼写”为\\( ......但不包括它的最后的子字符串 - 由括号括起来的构造(?<=)表示。这被称为积极的后视。
  3. 在括号后面加上任意字符(点)零次或多次(星号),但尽可能缩短,同时仍然满足整个正则表达式(问号)
  4. 确保它全部结束有一个括号,但不包括它的结果(类似于上文提到1.左括号,这就是所谓的积极的前瞻。
0

我想通了..

NSString *originalString = @"ConsumerVisit(201)" 
    NSRange start = [originalString rangeOfString:@"("]; 
    NSRange end = [originalString rangeOfString:@")"]; 
    NSString *betweenBraces; 
    if (start.location != NSNotFound && end.location != NSNotFound && end.location > start.location) { 
     betweenBraces = [originalString substringWithRange:NSMakeRange(start.location+1, end.location-(start.location+1))]; 
    } 
    NSLog(@"Sub string: %@", betweenBraces); 

输出>子串:201

感谢@paras n @vinu为我们的快速解答。

相关问题