2012-05-04 41 views
4

我有一個字符串:在引號之間獲取字符串的NSRange?

他昨天說「hello mate」。

我想從第一個引號到最後一個引號得到一個NSRange。所以我嘗試這樣的:

NSRange openingRange = [title rangeOfString:@"\""]; 
NSRange closingRange = [title rangeOfString:@"\""]; 
NSRange textRange = NSMakeRange(openingRange.location, closingRange.location+1 - openingRange.location); 

但我不知道如何區分第一個報價和第二個報價。我將如何做到這一點?

回答

5

你可以使用正則表達式是:

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([\"])(?:\\\\\\1|.)*?\\1" options:0 error:&error]; 

NSRange range = [regex rangeOfFirstMatchInString:myString options:0 range:NSRangeMake(0, [myString length]]; 

不要忘記檢查錯誤;)

+3

好吧,它工作正常,但這到底是什麼:'@「([\」])(?:\\\\\ 1 |。)*?\\ 1「'?? – Snowman

+1

@mohabitar這是一個[正則表達式](http://en.wikipedia.org/wiki/Regular_expression)我建議閱讀它們,它們非常強大和有用。(另外,[NSRegularExpression]的鏈接指向Apple文檔(https:// developer.apple.com/library/mac/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html)) –

+0

另外請注意,它大多看起來非常可怕,因爲我不得不逃脫一些字符(每個\和「)。 – JustSid

2

您可以隨時使用'rangeOfString:options:range:'作爲第二個(從第一個'location'之後開始)。

選項1

- (NSRange)rangeOfQuoteInString:(NSString *)str { 
    int firstMatch = [str rangeOfString:@"\""].location; 
    int secondMatch = [str rangeOfString:@"\"" options:0 range:NSMakeRange(firstMatch + 1, [str length] - firstMatch - 1)].location; 
    return NSMakeRange(firstMatch, secondMatch + 1 - firstMatch); 
} 

我希望這是正確的。晚餐時在我的手機上完成。 ;-)

但是,由於字符串範圍可能會做類似的實現,爲什麼不迭代字符串中的'char'值並尋找匹配#1 &#2?可能會更快或更快。

選項2

- (NSRange)rangeOfQuoteInString:(NSString *)str { 
    int firstMatch = -1; 
    int secondMatch = -1; 
    for (int i = 0; i < [str length]; i = i + 1) { 
     unichar c = [str characterAtIndex:i]; 
     if (c == '"') { 
      if (firstMatch == -1) { 
       firstMatch = i; 
      } else { 
       secondMatch = i; 
       break; 
      } 
     } 
    } 
    if (firstMatch == -1 || secondMatch == -1) { 
     // No full quote was found 
     return NSMakeRange(NSNotFound, 0); 
    } else { 
     return NSMakeRange(firstMatch, secondMatch + 1 - firstMatch); 
    } 
} 
+0

我會怎麼用那種方法? – Snowman

+0

你問什麼方法? – mbm29414

+0

@ mbm30075你的第二個版本很容易出現編碼問題(和'characterAtIndex:'返回unichar,而不是char!) – JustSid