NSRegularExpression分隔段落

考虑这个文本:

Paragraph 1: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Paragraph 2 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Paragraph 3 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 

在ObjC中,阅读上述文本时,段落1和段落2之间有两个\n\n行间隔。 但是段落2和段落3之间有3个以上的行距。

我想有一个NSRegularExpression模式,将读取和返回这些段落完全忽略行数的数量。

 NSString *pattern = @"\n(*\n)\n"; NSRegularExpression* regex1 = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; NSArray *array = [regex1 matchesInString:p options:0 range:NSMakeRange(0, [p length])]; for(NSTextCheckingResult *tcr in array){ NSTextCheckingResult *tcr = [regex1 firstMatchInString:p options:0 range:NSMakeRange(0, p.length)]; NSRange matchRange = [tcr rangeAtIndex:1]; NSString *amatch = [p substringWithRange:matchRange]; NSLog(@"Found string: %@", amatch); } 

我是新的NSRegularExpression,任何参考更好的教程将是伟大的。 在这种情况下,在上述问题中是否正确的做法呢?

下面是这个工作。 我也使用enumerateMatchesInString来查找匹配。

 NSString *pattern = @"(\\A|\\n\\s*\\n)(.*?\\S[\\s\\S]*?\\S)(?=(\\Z|\\s*\\n\\s*\\n))"; NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error]; [regex enumerateMatchesInString:input options:0 range:NSMakeRange(0, [input length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { NSString *match = [input substringWithRange:[result rangeAtIndex:2]]; NSLog(@"match = '%@'", match); }]; 

这不仅返回两个换行符之间的string(忽略返回之间的任何多余的空格),而且还返回第一个(即string的开始和两个换行符的第一个序列之间)和最后一个(即最后一个两个换行符的序列和string的结尾。

你不需要NSRegularExpression来做到这一点。 NSString中有一些真正有用的自然语言parsing函数。

最好的办法是像这样枚举string…

 NSString *string = @"Paragraph 1: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\n\nParagraph 2 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n\n\n\n\n\n\n\n\n\nParagraph 3 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."; NSMutableArray *paragraphs = [NSMutableArray array]; [string enumerateSubstringsInRange:NSMakeRange(0, string.length) options:NSStringEnumerationByParagraphs usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { [paragraphs addObject:substring]; }]; for (NSString *paragraph in paragraphs) { NSLog(@"%@", paragraph); } 

这将采取每个段落,并把它放在段落NSMutableArray。

这不需要任何parsing或正则expression式等…它可能会比任何你可以写,因为它是一个本地函数更快。

我相信使用标准的NSString方法可能会更容易些:

 NSArray *allParagraphs = [text componentsSeparatedByString:@"\n\n"]; NSCharacterSet *charactersToTrim = [NSCharacterSet whitespaceAndNewlineCharacterSet]; for (NSString *paragraph in allParagraphs) { NSString *trimmedParagraph = [paragraph stringByTrimmingCharactersInSet:charactersToTrim]; } 

或者,如果您想使用正则expression式,请尝试如下所示:

 "(.*?)(\\n{2,}|$)" 

它保留所有的符号,直到它find两个或更多的新行或文件结尾

编辑。

 NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"(.*?)(\\n{2,}|$)" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; [regexp enumerateMatchesInString:TEST_STRING options:0 range:NSMakeRange(0, TEST_STRING.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop){ NSLog(@"%@", [TEST_STRING substringWithRange:[result rangeAtIndex:1]]); }]; 

我不能帮你用NSRegularExpression匹配和replace,但我相信你正在寻找的正则expression式是\\n(\\n)+

您需要两次转义换行符。 一次为Cstring,一次为正则expression式。 +字符表示以前的一个或多个组。