0

私は個人用のiPadアプリを作成していますが、一部の文字列の文字置換に苦労しています。たとえば、「\ t \ t \tCD」を含むNSStringを取得しました。今私がやりたいのは、そこにあるすべてのCとすべてのDをC#とD#に置き換えることです。私はそれをなんとかすることができましたが、残念ながらそれは私にはまったく効率的に見えません。

これまでの私のコードは次のとおりです。

- (IBAction)buttonPressed:(id)sender
{
    if(sender)
    {
        NSError *error;
        NSString *newTab = [[NSString alloc] init];
        NSRegularExpression *regexC = [NSRegularExpression regularExpressionWithPattern:@"C" options:0 error:&error];
        NSRegularExpression *regexD = [NSRegularExpression regularExpressionWithPattern:@"D" options:0 error:&error];

        newTab = [regexC stringByReplacingMatchesInString:self.tab options:0 range:NSMakeRange(0, self.tab.length) withTemplate:@"C#"];

        NSString *newTabAfterFirstRegex = [[NSString alloc] initWithString:newTab];

        newTabAfterFirstRegex = [regexD stringByReplacingMatchesInString:newTab options:0 range:NSMakeRange(0, newTab.length) withTemplate:@"D#"];

        NSLog(@"%@",newTabAfterFirstRegex);
    }

}

さらに、これは単なる小さなテスターコードです。私が本当にやりたいのは、特定の文字列内のすべての音楽タブ(CC#DD#EFF#GG#AA#B)のインスタンスをチェックするアルゴリズムを用意することです。IBActionがトリガーされると、それぞれが必要になります。次のものに置き換えられます(そしてBはCになります)。

どんなアイデアでも大歓迎です!

どうもありがとうございます!

4

3 に答える 3

0

特定の文字列に一致するように正規表現(例:'[AG]#?')を設定できます。メソッド-matchesInString:options:range:を使用すると、すべての一致をループして(各一致の範囲が返されます)、その範囲を使用して置換を行うことができます。

于 2012-12-31T16:56:50.143 に答える
0

正規表現はこれには少しやり過ぎのように見えます。2つの文字列を置き換えるだけで、次を使用して正規表現からすべてのオーバーヘッドを取得することはありません。

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target 
                                    withString:(NSString *)replacement

2回交換するだけです。また、NSStringの割り当てを行う必要はありません。これは、戻り値で参照を作成するためです。

于 2012-12-31T18:24:46.757 に答える
0

先日、以下の暗号化方式を作成しました。私はあなたの目的のためにそれをテストしました、そしてそれはうまくいくようです。

-(NSString *)ReplaceMe:(NSString *)s {
// Putting the source into an array
NSMutableArray *myArray = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < s.length; i++) {
    [myArray addObject: [self Mid:s :i :1]];
}
// Creating a string with the revised array
NSMutableString *myString = [NSMutableString new];
for (i = 0; i < s.length; i++) {
    [myString appendString:[self Conversion:[myArray objectAtIndex:i]]];
}
// Final
return myString;
}

上記の方法では、2つの追加機能が必要です。

-(NSString *)Mid:(NSString *)str:(NSInteger)s:(NSInteger)l {
if ((s <= str.length-1) && (s + l <= str.length) && (s >= 0) && (l >= 1)) {
    return [str substringWithRange:NSMakeRange(s, l)];
}
else {
    return @"";
}
}

もう1つは...

-(NSString *)Conversion:(NSString *)s {
if ([s isEqualToString:@"C"]) {
    return @"C#";
}
else if ([s isEqualToString:@"D"]) {
    return @"D#";
}
else {
    return s;
}
}

上記の関数に他の変換ペアを入れることができます。以下は、ReplaceMeの使用方法の例です。

- (IBAction)clickAction:(id)sender {
textField2.text = [self ReplaceMe:textField1.text];
}

つまり、ReplaceMeは非常に使いやすいです。

于 2012-12-31T18:29:57.603 に答える