1

文字列があり、「#」で始まり「.」で終わる単語 (タグ) を検索したい。または "," または " " これはオンラインで見つけましたが、以下の理由で限定されています:

NSString *stringText = @"test #hello #world";
NSString *result = nil;

// Determine  "#"
NSRange hashRange = [stringText rangeOfString:@"#" options:NSCaseInsensitiveSearch];
if (hashRange.location != NSNotFound)
{
    // Determine " " location according to "#" location
    NSRange endHashRange;

    endHashRange.location = hashRange.length + hashRange.location;
    endHashRange.length   = [stringText length] - endHashRange.location;
    endHashRange = [stringText rangeOfString:@" " options:NSCaseInsensitiveSearch range:endHashRange];

    if (endHashRange.location != NSNotFound)
    {
        // Tags found: retrieve string between them
        hashRange.location += hashRange.length;
        hashRange.length = endHashRange.location - hashRange.location;

        result = [stringText substringWithRange:hashRange];
    }
}

どうすればいいのか分かりますか?

ありがとうございました!

4

3 に答える 3

2

NSRegularExpression次のようにクラスを使用できます。

NSError *error = NULL;
NSRegularExpression *tags = [NSRegularExpression
    regularExpressionWithPattern:@"[#]([^, .]+)([, .]|$)"
    options:NSRegularExpressionCaseInsensitive
    error:&error];
NSArray *matches = [tags matchesInString:str options:0 range:NSMakeRange(0, str.length)];

for (NSTextCheckingResult *match in matches) {
    NSLog(@"%@", [str substringWithRange:[match rangeAtIndex:1]]);
}

正しく表示するには、正規表現をいじる必要があるかもしれません。私が気に入ったリファレンスでは、Apple のクラスでサポートされている正規表現言語の文法について説明しています。

于 2012-04-27T15:20:37.767 に答える
1

複数の一致が得られるNSRegularExpressionを使用する必要があります。以下はテストされていない例です。

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b(#\\S*[.,])\\b" options:NSRegularExpressionCaseInsensitive];
int numberOfMatches = [regex numberOfMatchesInString:string options:0 range:NSMakeRange(0, string.length)];
NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
于 2012-04-27T15:19:52.853 に答える
1

ほとんどの場合、NSScanner を使用する必要があります。

NSString *stringText = @"test #hello #world";
NSString *result = nil;
NSCharacterSet *endingChars = [NSCharacterSet characterSetWithCharactersInString:@"., "];

NSScanner *scanner = [NSScanner scannerWithString:stringText];
scanner.charactersToBeSkipped = nil;

[scanner scanUpToString:@"#" intoString:NULL];
[scanner scanString:@"#" intoString:NULL];
[scanner scanUpToCharactersFromSet:endingChars intoString:&result];
[scanner scanCharactersFromSet:endingChars intoString:NULL];

STAssertEqualObjects(result, @"hello", nil);

その時点で、[scanner isAtEnd]; までループするだけです。


NSString *stringText = @"test #hello #world";
NSString *match = nil;
NSMutableArray *results = [NSMutableArray arrayWithCapacity:2];
NSCharacterSet *endingChars = [NSCharacterSet characterSetWithCharactersInString:@"., "];

NSScanner *scanner = [NSScanner scannerWithString:stringText];
scanner.charactersToBeSkipped = nil;

while (![scanner isAtEnd]) {
    [scanner scanUpToString:@"#" intoString:NULL];
    [scanner scanString:@"#" intoString:NULL];
    [scanner scanUpToCharactersFromSet:endingChars intoString:&match];
    [scanner scanCharactersFromSet:endingChars intoString:NULL];
    [results addObject:match];
}

STAssertEquals(results.count, 2, nil);
STAssertEqualObjects([results objectAtIndex:0], @"hello", nil);
STAssertEqualObjects([results objectAtIndex:1], @"world", nil);
于 2012-04-27T15:27:14.933 に答える