0

私は文字列から単純な文字列を抽出しようとしましたが、成功しませんでしたが、結果は常に
ここの文字列が私が持っているものであるためです:

-(NSString*) ExtractArtistNameFromString:(NSString*) line
{

    NSString* substringForMatch = @""   
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d+\\s+(.*)"
                                                                        options:NSRegularExpressionCaseInsensitive
                                                                        error:&error];

    if (error) {
        NSLog(@"Error:%@", error);  
    }

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

    NSUInteger elements = [matches count];
    NSLog(@"numberOfMatches:%u",elements);

    if(elements > 0)
    {

        for(NSTextCheckingResult *match in matches)
        {
            NSString* substringForMatch = [line substringWithRange:match.range];
            NSUInteger slen = [substringForMatch length];
            NSLog(@"Extracted  : %@",substringForMatch);
            NSLog(@"%u",slen);
            NSLog(@"%@",substringForMatch);
        }        
    }
    return substringForMatch;
} 

入力文字列は:

1バルソッティ、マルセル

私が抽出しようとしているのは、次の名前です:Barsotti、Marcel

アプリを実行すると、次の結果が得られます。

2013-01-29 11:31:24.056 file_parser[2496] numberOfMatches:1
2013-01-29 11:31:24.062 file_parser[2496] Extracted  : 1        Barsotti, Marcel
2013-01-29 11:31:24.064 file_parser[2496] 18
2013-01-29 11:31:24.066 file_parser[2496] 1     Barsotti, Marcel

WindowsでGNUsetupを使用している場合、makeコマンドは次のとおりです。

CC=clangを作成します

4

1 に答える 1

1

あなたがやろうとしていることがわかります。NSTextCheckingResultのドキュメントには、結果に複数の範囲が含まれる可能性があることが示されていますが、参照しているのは最初の範囲のみです。

たとえば、正規表現と文字列には1つの一致があり、その中に1つのキャプチャグループがあります。これらは:

  1. 1バルソッティ、マルセル
  2. バルソッティ、マルセル

は1つしかありませんがNSTextCheckingResult、その中には複数の範囲があります。あなたが使っていた

NSString* substringForMatch = [line substringWithRange:match.range];

これにより、上記の最初の結果が返されます。あなたが欲しいのは2番目です。これを取得するには、を使用する必要があります

NSString* substringForMatch = [line substringWithRange:[match rangeAtIndex:1]];

を超えないようにするために、範囲内にとどまることができるrangeAtIndex:プロパティが存在します。numberOfRanges覚えておいてください、[match rangeAtIndex:0]はで同じmatch.rangeです。

于 2013-01-29T10:16:52.997 に答える