我尝试了一些算法,但没有运气解决这个问题。
让我们通过示例
进一步解释行为我们有一个字符串:@"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,它会将空格保留为单词的一部分。
并忘记了该单词的第一个字符。
有人可以提供一些有用的建议。
答案 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.
}