我有一个字符串:
他昨天说“你好伙计”。
我想从第一个报价到最后一个报价获得NSRange。所以我试过这样的事情:
NSRange openingRange = [title rangeOfString:@"\""];
NSRange closingRange = [title rangeOfString:@"\""];
NSRange textRange = NSMakeRange(openingRange.location, closingRange.location+1 - openingRange.location);
但我不确定如何区分第一个引用和第二个引用。我该怎么做?
答案 0 :(得分:6)
您可以使用正则表达式:
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]];
不要忘记检查错误;)
答案 1 :(得分:2)
您可以随时使用'rangeOfString:options:range:'作为第二个(从第一个'位置'开始)。
选项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);
}
}