2

すべての略語を検索するために使用したいのですenumerateMatchInStringが、メソッドを呼び出してConvertAbbreviation:(NSString *)abbr;その略語を隠し、完全な文字列を返します。

誰かがこれを手伝ってくれますか?以下のコードを試してみると、例外が発生します。これが間違っている場合、誰かがブロック内の元のテキストを変更する方法の例を教えてください。

- (NSString *) convertAllAbbreviationsToFullWords:(NSString *) textBlock {

NSRegularExpression *matchAnyPotentialAbv  = [NSRegularExpression regularExpressionWithPattern:@"[a-zA-Z\\.]+\\.\\s" options:0 error:nil];

[matchAnyPotentialAbv 
     enumerateMatchesInString:textBlock
     options:0
     range:NSMakeRange(0, [textBlock length])
     usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {

        /* on each match, I would like to call convert(match) and
           replace the result with the existing match in my textBlock */ 

        if (++count >= 200) *stop = YES;
     }
     ];
    return textBlock;
}
4

2 に答える 2

13

逆方向検索を試す必要があります。そうしないと、最初にテキストを変更すると、テキスト範囲が無効になります。

したがって、このようにすべての一致を列挙します(このトリックを使用して逆方向に進むことができます):

NSArray *results = [matchAnyPotentialAbv matchesInString:textBlock options:kNilOptions range:NSMakeRange(0, textBlock.length)];

for(NSTextCheckingResult *result in [results reverseObjectEnumerator])
{
    //Replace
}
于 2012-07-08T02:16:27.800 に答える
2

NSRegularExpressionの-replacementStringForResult:inString:offset:template:]APIを使用すると、おそらくこれを行うためのよりクリーンな方法が提供され、私にとってはうまく機能しました。使用ガイドについては、以下を参照してください。

NSRegularExpressionのreplacementStringForResult:inString:offset:templateをどのように使用しますか:

于 2013-08-09T22:10:51.260 に答える