【问题标题】:Separate Full Sentences in a block of NSString text在 NSString 文本块中分隔完整句子
【发布时间】:2012-07-09 20:20:13
【问题描述】:

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

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

输出应该是一个数组

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

第二个元素:你好吗?

第三个元素:哇!!

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

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

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

感谢您的帮助,

【问题讨论】:

    标签: objective-c ios ios5 ios4


    【解决方案1】:

    您想将-[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;
    }
    

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

    【讨论】:

    • @FazYa:没有标点符号的“Hi”仍然是一个句子。如果您真的想过滤掉它,您可以检查最后一个结果是否有任何标点符号,如果没有,则将其丢弃。至于本地化,如果期望文本属于用户的默认语言环境(例如,如果它是用户输入的文本,它可能会),则使用它,但如果您希望文本与用户的默认语言环境无关,请不要使用它.
    【解决方案2】:

    这样的事情可以完成这项工作:

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

    【讨论】:

    • 感谢您的回复。我对使用内部 NSStringEnumerationBySentences 有两个担忧。首先,当我根本没有句子时,它仍然返回一个完整的句子。示例:您好,返回一句话。这可能更像是一种行为,但如果没有完整的句子,我可以让它不添加任何元素吗? 2- 我需要添加 NSStringEnumerationLocalized 吗?
    • @FazYa 我认为凯文回答了您的两个问题。现在...“嗨”不是严格意义上的 linguistic definition of 'sentence' 句子,但如果您愿意深入研究,可以考虑使用 CFStringTokenizer
    【解决方案3】:

    或使用:

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

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多