2012-04-27 79 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