在NSString文本块中分隔完整句子

我一直在尝试使用正则表达式来分隔大块文本中的完整句子。 我不能使用componentsSeparatedByCharactersInSet,因为它显然会失败,句子以?!,!!,…结尾…我已经看到一些外部类来做componentSeparateByRegEx但是我更喜欢这样做而不添加外部库。

这是一个示例输入嗨,我正在测试。 你好吗? 哇!! 这是最好的,我很高兴。

输出应该是一个数组

第一个元素: 嗨,我正在测试。

第二个要素: 你好吗?

第三元素: 哇!!

第四个要素: 这是最好的,我很高兴。

这就是我所拥有的,但正如我所提到的,它不应该做我想要的。 正则表达式可能会在这里做得更好。

-(NSArray *)getArrayOfFullSentencesFromBlockOfText:(NSString *)textBlock{ NSMutableCharacterSet *characterSet = [[NSMutableCharacterSet alloc] init]; [characterSet addCharactersInString:@".?!"]; NSArray * sentenceArray = [textBlock componentsSeparatedByCharactersInSet:characterSet]; return sentenceArray; } 

谢谢你的帮助,

您希望使用-[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; } 

注意,在测试中,每个子字符串在标点符号后似乎都包含尾随空格。 你可能想把它们剥掉。

像这样的东西可以完成这项工作:

 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 }]; 

或使用:

  [mutstri enumerateSubstringsInRange:NSMakeRange(0, [mutstri length]) options:NSStringEnumerationBySentences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ NSLog(@"%@", substring); }];