0

我对 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并且outputNSTextFields。

4

1 回答 1

0

我想你可以用很多不同的方法来实现你想要的。这是一个简单的:

  1. 定义值/替换的映射
  2. 按长度排序(最大长度优先)
  3. 匹配和替换

可能是这样的:

#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 the syrise 5ow!

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

于 2014-05-24T20:31:43.690 回答