0

iOS アプリのビュー コントローラーに渡されるデータベースに大量の NSString があります。それらは、「これは $特別にフォーマットされた$ コンテンツを含むメッセージです」という形式になっています。

ただし、特別な書式設定の先頭の「$」を「[」で、末尾の「$」を「]」で変更する必要があります。私は NSScanner を使用できると感じていますが、これまでのところ、すべての試行でおかしな連結文字列が生成されました!

「$」でカプセル化された部分文字列を認識し、開始/終了文字と交換する簡単な方法はありますか? 多くの NSString には複数の「$」部分文字列があることに注意してください。

ありがとう!

4

5 に答える 5

2

正規表現を使用できます。

NSMutableString *str = [@"Hello $World$, foo $bar$." mutableCopy];

NSRegularExpression *regex;
regex = [NSRegularExpression regularExpressionWithPattern:@"\\$([^$]*)\\$"
                                                  options:0
                                                    error:NULL];
[regex replaceMatchesInString:str
                      options:0
                        range:NSMakeRange(0, [str length])
                 withTemplate:@"[$1]"];
NSLog(@"%@", str);
// Output:
// Hello [World], foo [bar].

パターン@"\\$([^$]*)\\$"

$<zero_or_more_characters_which_are_not_a_dollarsign>$

すべてのオカレンスは に置き換えられ[...]ます。$正規表現パターンではエスケープする必要があるため、パターンには非常に多くのバックスラッシュが含まれています。

stringByReplacingMatchesInString元の文字列を変更する代わりに、新しい文字列を作成する場合もあります。

于 2012-12-07T13:31:28.860 に答える
1

replaceOccurrencesOfString:start$ と end$ があるため、うまくいかないと思います。

ただし、文字列を分離すると[string componentsSeperatedByString:@"$"]、部分文字列の配列が得られるため、2 つおきの文字列が「$speciallyformatted$」文字列になります。

于 2012-12-07T13:08:20.597 に答える
1
// string = @"This is a $special markup$ sentence."
NSArray *components = [string componentsSeparatedByString:@"$"];
// sanity checks
if (components.count < 2) return; // maybe no $ characters found
if (components.count % 2) return; // not an even number of $s
NSMutableString *out = [NSMutableString string];
for (int i=0; i< components.count; i++) {
   [out appendString:components[i]];
   [out appendString: (i % 2) ? @"]" : @"[" ];
}
// out = @"This is a [special markup] sentence."
于 2012-12-07T13:16:37.377 に答える
1

これはうまくいくはずです!

NSString *str = @"This is a message with $specially formatted$ content";
NSString *original = @"$";
NSString *replacement1 = @"[";
NSString *replacement2 = @"]";

BOOL start = YES;
NSRange rOriginal = [str rangeOfString: original];
while (NSNotFound != rOriginal.location) {
    str = [str stringByReplacingCharactersInRange: rOriginal withString:(start?replacement1:replacement2)];
    start = !start;
    rOriginal = [str rangeOfString: original];
}

NSLog(@"%@", str);

プログラミングを楽しもう!

于 2012-12-07T13:09:28.663 に答える
0

これを試してください

NSMutableString *string=[[NSMutableString alloc]initWithString:@"This is a message with $specially formatted$ content. This is a message with $specially formatted$ content"];


NSMutableString *string=[[NSMutableString alloc]initWithString:@"This is a message with $specially formatted$ content. This is a message with $specially formatted$ content"];

BOOL open=YES;
for (NSUInteger i=0; i<[string length];i++) {
    if ([string characterAtIndex:i]=='$') {
        if (open) {
            [string replaceCharactersInRange:NSMakeRange(i, 1) withString:@"["];
            open=!open;
        }
        else{
            [string replaceCharactersInRange:NSMakeRange(i, 1) withString:@"]"];
            open=!open;
        }
    }
}
NSLog(@"-->%@",string);

出力:

-->This is a message with [specially formatted] content. This is a message with [specially formatted] content
于 2012-12-07T13:35:52.417 に答える