0

したがって、次の形式の文字列を解析しようとしています。

baz@marroon#red#blue #big@cat#dog

または、スペースで区切ることもできます:

baz @marroon #red #blue #big @cat #dog

そして、これが私が今やっている方法です:

- (void) parseTagsInComment:(NSString *) comment
{
    if ([comment length] > 0){
        NSArray * stringArray = [comment componentsSeparatedByString:@" "];
        for (NSString * word in stringArray){
            
        }
    }
}

スペースで区切られたコンポーネントが機能していますが、スペースがない場合はどうなりますか..これらの単語をどのように繰り返すのですか? 私は正規表現を使用することを考えていました..しかし、そのような正規表現をobjective-Cで書く方法がわかりません。これらの両方のケースをカバーする正規表現のアイデアはありますか?

これが私の最初の試みです:

NSError * error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(@|#)\\S+" options:NSRegularExpressionCaseInsensitive error:&error];
    
    NSArray* wordArray = [regex matchesInString:comment 
                                      options:0 range:NSMakeRange(0, [comment length])];
    
    for (NSString * word in wordArray){
       
    }

これは機能しません..正規表現が間違っていると思います。

4

3 に答える 3

2

分離された文字列とその範囲の文字列表現を配列に入れる NSScanner を使用してそれを行う方法を次に示します (これは、元の文字列が # で始まっていることを前提としています。そうでなく、必要な場合は、単に文字列の先頭にハッシュを追加します)。

NSMutableArray *array = [NSMutableArray array];
    NSString *str = @"#baz@marroon#red#blue #big@cat#dog";
    NSScanner *scanner = [NSScanner scannerWithString:str];
    NSCharacterSet *searchSet = [NSCharacterSet characterSetWithCharactersInString:@"#@"];
    NSString *outputString;

    while (![scanner isAtEnd]) {
        [scanner scanUpToCharactersFromSet:searchSet intoString:nil];
        [scanner scanCharactersFromSet:searchSet intoString:&outputString];
        NSString *symbol = [outputString copy];
        [scanner scanUpToCharactersFromSet:searchSet intoString:&outputString];
        NSString *wholePiece = [[symbol stringByAppendingString:outputString]stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        NSString *rangeString = NSStringFromRange([str rangeOfString:wholePiece]);
        [array addObject:wholePiece];
        [array addObject:rangeString];
    }
    NSLog(@"%@",array);
于 2012-05-26T05:55:48.243 に答える
1

本当に必要な正規表現は[@#]?\\w+. オプションで @ または # が先行する文字のグループを検索します。@ と # を含む非スペース文字を検索するため、式は機能しません。(「言葉」に含まれる内容によっては、 よりも多かれ少なかれ具体的なものが必要になる場合がありますが\w、質問からは明らかではありません。)

于 2012-05-26T06:47:24.463 に答える
0

範囲が必要な場合は、NSRegularExpressionがおそらくうまく機能します。

NSString *comment = @"@baz@marroon#red#blue #big@cat#dog";

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[#@]\\w+" options:0 error:nil];

NSArray* wordArray = [regex matchesInString:comment 
                                    options:0 
                                      range:NSMakeRange(0, [comment length])];

for (NSTextCheckingResult *result in wordArray)
    NSLog(@"%@", [comment substringWithRange:result.range]);

または、[@#][a-zA-z]+ASCIIアルファワードのみで問題がない場合に機能します。

于 2012-05-26T10:08:59.217 に答える