2012-04-27 80 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 2012-04-27 15:48:53

+0

@Vins看看編輯,這應該澄清從'matches'數組中獲取實際字符串的方式。 – dasblinkenlight 2012-04-27 15:53:06

+0

哇!非常感謝! – Vins 2012-04-27 15:56:10

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 2012-04-27 15:49:43

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 2012-04-27 15:50:22

+0

好的,我已經更新了樣本單元測試 – 2012-04-30 18:19:12