NSString:在索引处查找单词范围

时间:2013-09-14 00:14:01

标签: objective-c

我尝试了一些算法,但没有运气解决这个问题。

让我们通过示例

进一步解释行为

我们有一个字符串:@"example example"

所以,如果我在字符串上调用 rangeOfWordAtIndex:10

结果将是:位于第9位且长度为7的单词@"example"

它不应该给@"example" at index 0 with a length of 7

以下是我目前制作的代码:

#define unicode_space 32 // this is correct printed it out from code
@implementation NSString (wordAt)

- (NSRange) rangeOfWordAtIndex:(NSInteger) index
{
    NSInteger beginIndex = index;
    while(beginIndex > 0 && [self characterAtIndex:beginIndex-1] != unicode_space)
    {
        beginIndex--;
    }
    NSInteger endIndex = index;
    NSInteger sLenght = [self length];
    while (endIndex < sLenght && [self characterAtIndex:endIndex+1] != unicode_space)
    {
        endIndex++;
    }
    return NSMakeRange(beginIndex, endIndex - beginIndex);
}

@end

但它不起作用。如果没有+1和-1,它会将空格保留为单词的一部分。

并忘记了该单词的第一个字符。

有人可以提供一些有用的建议。

1 个答案:

答案 0 :(得分:2)

检测单词比查找U+0020 SPACE字符要复杂一些。幸运的是,Foundation提供了具有完全Unicode支持的NSLinguisticTagger类。以下是在给定索引处找到单词及其范围的方法:

<强>目标C

NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[ NSLinguisticTagSchemeTokenType ] options:kNilOptions];
tagger.string = @"Hello, World!";
NSRange range = NSMakeRange(0, 0);
NSString *tag = [tagger tagAtIndex:10 scheme:NSLinguisticTagSchemeTokenType tokenRange:&range sentenceRange:nil];

if ([tag isEqualToString:NSLinguisticTagWord]) {
    NSString *word = [tagger.string substringWithRange:range];
    // You have the word: "World"
}
else {
    // Punctuation, whitespace or other.
}

<强>夫特

let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagSchemeTokenType], options: 0)
tagger.string = "Hello, World!"
var range : NSRange = NSRange(location: 0, length: 0)
let tag = tagger.tagAtIndex(10, scheme: NSLinguisticTagSchemeTokenType, tokenRange: &range, sentenceRange: nil)

if let string = tagger.string where tag == NSLinguisticTagWord {
    let word = (string as NSString).substringWithRange(range)
    // You have the word: "World"
}
else {
    // Punctuation, whitespace or other.
}