2013-04-15 69 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爲我們的快速解答。

相關問題