2012-04-27 5 views
1

文字列があり、「#」で始まり「。」で終わる単語(タグ)を検索したい。または「」または 『』私はこのオンラインを見つけましたが、ため制限されている: - (より多くの言葉がありますが) あなたは、文字列内の単一の単語を見つけることができます - 『RangeOfString』複数の選択肢文字列内のタグを検索する

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]; 
    } 
} 
を許可しません。

あなたはどうすればいいですか?

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

答えて

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のクラスでサポートされている正規表現言語の文法を記述しています。

+0

ありがとうございますが、私はマッチから外挿することはできません。彼は正しい数の単語を返しますが、単語ではなくコードを返します。 – Vins

+0

@Vins編集を見て、これは 'matches'配列から実際の文字列を得る方法を明確にするはずです。 – dasblinkenlight

+0

うわー!どうもありがとう! – Vins

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])]; 
+0

おかげで、私は試合から外挿することはできません。彼は正しい数の単語を返しますが、単語ではなくコードを返します。 – Vins

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); 
+0

ループを作成してすべての単語を正確に取得するにはどうすればよいですか?ありがとう、 – Vins

+0

OK、サンプルユニットテストを更新しました –

関連する問題