1

考虑这段文字:

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.

\n\n在ObjC中,阅读上面的文字时, paragraph1和paragraph2之间有两行空格。但是在第 2 段和第 3 段之间有超过 3 个行间距\n\n\n\n

我想要一个 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 的新手,任何对更好教程的参考都会很棒。在这种情况下,这是解决上述问题的正确方法吗?

4

4 回答 4

4

您不需要 NSRegularExpression 来执行此操作。NSString 内置了大量非常有用的自然语言解析函数。

最好的方法是像这样枚举字符串......

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 段落中。

这不需要任何解析或正则表达式等......它也可能比你可以编写的任何东西都快,因为它是一个原生函数。

于 2013-01-30T13:47:37.873 回答
1

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

NSArray *allParagraphs = [text componentsSeparatedByString:@"\n\n"];

NSCharacterSet *charactersToTrim = [NSCharacterSet whitespaceAndNewlineCharacterSet];
for (NSString *paragraph in allParagraphs) {
    NSString *trimmedParagraph = 
            [paragraph stringByTrimmingCharactersInSet:charactersToTrim];
}

或者,如果您想使用正则表达式,请尝试以下操作:

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

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

编辑。

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]]);
                      }];
于 2013-01-30T13:35:56.517 回答
0

我无法帮助您进行 NSRegularExpression 匹配和替换,但我相信您正在寻找的正则表达式是\\n(\\n)+.

您需要两次转义换行符。一次用于 C 字符串,一次用于正则表达式。+ 字符表示前一组中的一个或多个。

于 2013-01-28T19:02:44.113 回答
0

下面的工作。我还使用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);
                     }];

这不仅返回两个换行符之间的字符串(忽略返回之间的任何额外空格),还返回第一个(即在字符串的开头和两个换行符的第一个序列之间)和最后一个(即在最后一个两个换行符的序列和字符串的结尾。

于 2013-01-30T04:46:33.840 回答