考虑以下案文:
第1段:洛雷姆同坐,圣洁,做苦力和马格纳苦力。从现在到现在,我的工作一直都是这样的。第2款从现在到现在,我的工作一直都是这样的。第3款从现在到现在,我的工作一直都是这样的。
在ObjC中,在阅读上面的文本时,paragraph1和paragraph2之间有两个\n\n行空间。但在\n\n\n\n和paragraph2之间有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新手,任何关于更好的教程的参考都会很棒。在这种情况下,在上面的问题中,这是正确的方法吗?
发布于 2013-01-30 04:46:33
下列人员负责这项工作。我还使用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-30 13:47:37
你不需要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-30 13:35:56
我相信用标准的NSString方法可以做得更容易:
NSArray *allParagraphs = [text componentsSeparatedByString:@"\n\n"];
NSCharacterSet *charactersToTrim = [NSCharacterSet whitespaceAndNewlineCharacterSet];
for (NSString *paragraph in allParagraphs) {
NSString *trimmedParagraph =
[paragraph stringByTrimmingCharactersInSet:charactersToTrim];
}或者,如果您想使用regexp,请尝试如下所示:
"(.*?)(\\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]]);
}];https://stackoverflow.com/questions/14569074
复制相似问题