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.

ObjCでは、上記のテキストを読むとき、\n\nparagraph1とparagraph2の間に2行のスペースがあります。\n\n\n\nただし、paragraph2とparagraph3の間には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を初めて使用します。より良いチュートリアルへの参照は、すばらしいでしょう。この場合、これは上記の質問でそれを実行する正しい方法ですか。

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,}|$)"

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

以下は仕事をします。また、 を使用し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);
                     }];

これは、2 つの改行文字の間の文字列 (改行間の余分な空白を無視する) だけでなく、最初の文字列 (つまり、文字列の先頭と 2 つの改行の最初のシーケンスの間) と最後の文字列 (つまり、最後の文字列の間) も返します。 2 つの改行のシーケンスと文字列の末尾。

于 2013-01-30T04:46:33.840 に答える
0

NSRegularExpression のマッチングと置換についてはお手伝いできませんが、お探しの正規表現は\\n(\\n)+.

改行文字を 2 回エスケープする必要があります。1 回は C 文字列用、もう 1 回は正規表現用です。+ 文字は、前のグループの 1 つ以上を意味します。

于 2013-01-28T19:02:44.113 に答える