我一直在尝试使用正则表达式来分隔大块文本中的完整句子。我不能使用componentsSeparatedByCharactersInSet,因为它显然会失败,句子以?!,!!,...结尾...我已经看到一些外部类来做componentSeparateByRegEx但是我更喜欢这样做而不添加外部库。
这是一个示例输入 嗨,我正在测试。你好吗?哇!!这是最好的,我很高兴。
输出应为数组
第一个元素:嗨,我正在测试。
第二个要素:你好吗?
第三个要素:哇!!
第四要素:这是最好的,我很高兴。
这就是我所拥有的,但正如我所提到的,它不应该按照我的意图行事。正则表达式可能会在这里做得更好。
-(NSArray *)getArrayOfFullSentencesFromBlockOfText:(NSString *)textBlock{
NSMutableCharacterSet *characterSet = [[NSMutableCharacterSet alloc] init];
[characterSet addCharactersInString:@".?!"];
NSArray * sentenceArray = [textBlock componentsSeparatedByCharactersInSet:characterSet];
return sentenceArray;
}
感谢您的帮助,
答案 0 :(得分:13)
您希望将-[NSString enumerateSubstringsInRange:options:usingBlock:]
与NSStringEnumerationBySentences
选项一起使用。这将为您提供每一句话,并以语言意识的方式完成。
NSArray *fullSentencesFromText(NSString *text) {
NSMutableArray *results = [NSMutableArray array];
[text enumerateSubstringsInRange:NSMakeRange(0, [text length]) options:NSStringEnumerationBySentences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
[results addObject:substring];
}];
return results;
}
注意,在测试中,每个子字符串在标点符号后似乎都包含尾随空格。你可能想把它们剥掉。
答案 1 :(得分:3)
这样的事情可以完成这项工作:
NSString *msg = @"Hi, I am testing. How are you? Wow!! this is the best, and I am happy.";
[msg enumerateSubstringsInRange:NSMakeRange(0, [msg length])
options:NSStringEnumerationBySentences | NSStringEnumerationLocalized
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop)
{
NSLog(@"Sentence:%@", substring);
// Add each sentence into an array
}];
答案 2 :(得分:0)
或使用:
[mutstri enumerateSubstringsInRange:NSMakeRange(0, [mutstri length])
options:NSStringEnumerationBySentences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
NSLog(@"%@", substring);
}];