4

私は文字列を持っています:

彼は昨日「ハローメイト」と言った。

最初の見積もりから最後の見積もりまでのNSRangeを取得したいと思います。だから私はこのようなことを試みました:

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

しかし、最初の引用と2番目の引用を区別する方法がわかりません。どうすればいいですか?

4

2 に答える 2

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]];

エラーをチェックすることを忘れないでください;)

于 2012-05-04T23:45:05.830 に答える
2

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);
}

これが正しいことを願っています。夕食時に電話で完了しました。;-)

もう 1 つ、文字列の範囲も同様の実装を行う可能性が高いため、文字列内の '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);
    }
}
于 2012-05-04T23:40:16.250 に答える