2

我一直在尝试使用正则表达式来分隔一大段文本中的完整句子。我不能使用 componentsSeparatedByCharactersInSet 因为它显然会失败,句子以 ?!, !!, ... 我见过一些外部类来做 componentSeparateByRegEx 但我更喜欢不添加外部库。

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

输出应该是一个数组

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

第二要素: 你好吗?

第三要素:哇!!

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

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

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

谢谢你的帮助,

4

3 回答 3

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

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

于 2012-07-09T20:30:26.670 回答
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                                                                 
}];
于 2012-07-09T20:30:34.847 回答
0

或使用:

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

                                 NSLog(@"%@", substring);

                             }];
于 2017-06-19T12:47:15.930 回答