用Cocoa中的字符替换子字符串

时间:2014-05-24 19:56:54

标签: objective-c cocoa nsstring character-replacement

我对Cocoa编程很陌生,我最擅长创建一个程序,将用户输入文本放入文本字​​段,然后按一个按钮。按下按钮时,文本应该将某些子串替换为某些字符。所有子串都不超过2个字符,但有些字符长度为单个字符。更换完成后,新获取的文本将被放入另一个文本域。

子串替换的示例可以是“n”应该被改变为“5”,“nj”应该被改变为“g”并且“ng”将被改变为“s”。所以文本“现在注射注射器!”将改为“Igect the syrise 5ow!”

如何以简单而优雅的方式实现这一目标?我尝试了以下代码,但它似乎不起作用。

- (IBAction)convert:(id)sender {
    NSMutableString *x;
    [x setString:[self.input stringValue]];
    NSMutableString *output1;
    [output1 setString:@""];
    NSMutableString *middle;
    middle = [[NSMutableString alloc] init];
    int s;
    unsigned long length = [x length];
    for (s = 0; s < length; s = s + 1) {
        if (s + 2 <= length) {            // if more than or equal to two characters left
            [middle setString:[x substringWithRange:NSMakeRange(s, 2)]];
            if ([middle isEqualToString:@"nj"]) {
                [output1 appendToString:@"g"];
                s = s+1;
            } else if ([middle isEqualToString:@"ng"]) {
                [output1 appendToString:@"s"];
                s = s+1;
            } else {                      // if no two-character sequence matched
                [middle setString:[x substringWithRange:NSMakeRange(s, 1)]];
                if ([middle isEqualToString:@"n"]) {
                    [output1 appendString:@"5"];
                }
            }
        } else {                          // if less than two characters left
            [middle setString:[x substringWithRange:NSMakeRange(s, 1)]];
            if ([middle isEqualToString:@"n"]) {
                [output1 appendString:@"5"];
            }
        }
    }
    [self.output setStringValue:output1];
}

此处,*x是来自input的文字,*output1是存储结果的位置,*middle是由正在测试的文本组成的,input {1}}和outputNSTextField s。

1 个答案:

答案 0 :(得分:0)

我猜你可以通过不同的方法实现你想要的效果。这是一个简单的:

  1. 定义值/替换的地图
  2. 按长度排序(最大长度优先)
  3. 匹配并替换
  4. 或许这样的事情:

    #import <Foundation/Foundation.h>
    
    NSString * matchAndReplace(NSString *input, NSDictionary *map){
    
        NSMutableString *_input = [input mutableCopy];
    
        // Get all keys sorted by greatest length
        NSArray *keys = [map.allKeys sortedArrayUsingComparator: ^(NSString *key1, NSString *key2) {
            return [@(key2.length) compare:@(key1.length)];
        }];
    
        for (NSString *key in keys) {
            [_input replaceOccurrencesOfString:key
                                    withString:map[key]
                                       options:NSLiteralSearch
                                         range:NSMakeRange(0,_input.length)];
        }
        return [_input copy];
    
    };
    
    int main(int argc, char *argv[]) {
        @autoreleasepool {
            NSDictionary *mapping = @{
                @"n": @"5",
                @"nj": @"g",
                @"ng": @"s"
            };
    
            NSString *input = @"Inject the syringe now!";
    
            NSLog(@"Output: %@", matchAndReplace(input, mapping));
        }
    }
    

    将产生:

      

    输出:Igect syrise 5ow!

    注意:这是一种过于简化的方式来实现您想要的(显然)并且可能需要进行一些调整以涵盖每个边缘情况,但它比您的版本更简单,我希望这将有助于你。